Преобразование UTF-8 в UTF-32, предварительно вычисляя количество символов в каждом
У меня есть работающий алгоритм преобразования строки UTF-8 в строку UTF-32, однако я должен заранее выделить все пространство для моей строки UTF-32. Есть ли способ узнать, сколько символов в UTF-32 займет строка UTF-8?
Например, строка UTF-8 "¥0 " -это 3 символа, а после преобразования в UTF-32-2 беззнаковых Инта. Есть ли способ узнать количество символов UTF-32, которые мне понадобятся перед преобразованием? Или мне придется переписать текст? алгоритм?
1 ответ:
Есть два основных варианта:
Вы можете сделать два прохода через строку UTF-8, первый из которых подсчитывает количество символов UTF-32, которые вам нужно будет сгенерировать, а второй фактически записывает их в буфер.
Выделите максимальное количество 32-разрядных символов, которые вам могут понадобиться, то есть длину строки UTF-8. Это пустая трата памяти, но означает, что вы можете преобразовать utf8->utf32 за один проход.
Вы также можете использовать гибридный - например, если строка короче некоторого порога, то используйте второй подход, в противном случае используйте первый.
Для первого подхода первый проход будет выглядеть примерно так:
size_t len=0; // warning: untested code. for(const char *p=src; *p; ++p) { // characters that begin with binary 10xxxxxx... are continuations; all other // characters should begin a new utf32 char (assuming valid utf8 input) if ((*p & 0xc0) != 0x80) ++len; }