Преобразование 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;
}