Тип данных для строк UTF-8

Victor Gubin
Victor Gubin

Мотивация

В текущем стандарте строковый тип данных, это попросту массив байтов памяти.  Все операции по работе с строками перекладываются
на плечи программиста или бибилиотек. При этом в большинстве случаев работа с строками с переменной длинны символа
 может быть реализованна на уровне языка и комилятора.

На уровне языка можно ввести тип данных ustring, для которого выполняются следующие условия.

Тип - всегда указалель на область памяти

ustring LOREM = u8"Lorem ipsum";

u8"String" Единсвенный способ задать значение из литерала,
"Lorem ipsum" (не факт что UTF-8),  L"Lorem ipsum", u"Lorem ipsum", U"Lorem ipsum"  - ошибка компиляции.

Разрешаются только следующиее операторы:

Инткементация: ++a/a++  переводит указатель на следующий символ т.е. на 1/2/3/4 байта вперед в зависимости от текущего значения.
Если указетель выходит за границы строки ('\0'), то значение адреса сводится к nullptr.

Адресный +

ustring LOREM = u8"Lorem ipsum";

ustring a = LOREM + 2;

экивалент for(ustring a = LOREM, size_t i=0; i < 2; ++i, ++a);

ustring a = (LOREM + 13); // nullptr и ошибка компиляции для литералов.

Взятиие адреса:

ustring LOREM = u8"Lorem ipsum";

char32 b = *LOREM;

*LOREM = U'l';

разрешается только сведение к типу символа достаточно широкому для хранения полного UNICODE значения т.е. минимум 4-ре байта,
(char32, int, uint32_t и т.п.). И присвоение значения от типа не более чем 4-ре байта длинной.

Компилятор гененирует код для коддирования/де-коддирования символов в UTF-8/UTF-32

Оператор string_cast

ustring u8str = string_cast(U"Lorem ipsum"); 

char16_t u16str[] = string_cast(u8str);

char32_t u32str[] = string_cast(u32str);

Компилятор генерирует код для преобразования между представлениями UNICODE строк (или конвертирует строки на этапе компиляции, для литералов). Для локальных переменных функций память выделяется на стеке
если размер исходной строки заранее известен компилятору.     

Для совместимости с С функцими, допускатется

ustring u8str = u8"Lorem ipsum";

const char* c_str = static_cast<const char*>(u8str);

А так-же допускается прямое приведение типа из указателя на другой тип данных, c указанием размера памяти в байтах т.е. например:

void *rdbuf = std::calloc(1024, 1); std::fread(rdbuf, 1, 1024, fd);

const ustring u8str = string_cast( rdbuf, 1024);

Поведение delete [] u8str при этом не опеределено, поэтому компилятор явно генерирует ошибку при delete [] u8str

Выделение динамической пямяти:

ustring a = new ustring [16]; // выделяет аналогично new char32_t[16]

особождение строго по delete [] a;

sizeof

Если ustring s = u8"Lorem ipsum";

тогда:

sizeof(s)  - тоже что sizeof(void*) 

sizeof(&s) - длина строки в символах 

sizeof(*s) - дилина символа в байтах 1/2/3/4

sizeof(&&s) - кол-во памяти занятое строкой в памяти в байтах

5
рейтинг
5 комментариев
yndx-antoshkka
Необходим прототип, иначе обсуждение затянется на года. Так же необходимо продумать взаимодействие с iostream и std::locale
yndx-antoshkka
dmitriy@izvolov.ru
Обязательно ли вводить новый тип? Почему бы не реализовать в библиотеке?
dmitriy@izvolov.ru
Victor Dyachenko
dmitriy@izvolov.ru, поддерживаю. Это первый вопрос, который зададут в Комитете. Нужно очень хорошее обоснование, почему нельзя обойтись библиотекой.
Victor Dyachenko
Дмитрий Назаров
dmitriy@izvolov.ru, На самом деле в стандартной библиотеке есть некоторый функционал для работы с unicode. Начиная с c++11 в библиотеке есть codecvt. Правда стоит оговориться, что в c++17 он помечен как deprecated. Так что требуется либо доработать сам codeсvt, либо предложить ему альтернативу. Но определенно это должно быть реализовано библиотекой.
Дмитрий Назаров
Victor Gubin
string-view josephanders0n.github.io/2016/02/20/string-view.html
Или вот такой контейнер github.com/incoder1/libio/blob/master/include/conststring.hpp
(или QString, wxString и т.п. )
конечно позволяют работать с UNICODE.

Суть в том что С++ язык высокого уровня, а не assembler.

IMHO code_cvt - очень правильно объявлен устаревшим, спецификации шаблона могут бросить исключение и выделяют память через new и т.д.
Victor Gubin
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).