Преобразование UTF-8 в UTF-32 с предварительным вычислением количества символов в каждом

У меня есть рабочий алгоритм для преобразования строки UTF-8 в строку UTF-32, однако я должен выделить все пространство для моей строки UTF-32 заранее. Есть ли способ узнать, сколько символов в UTF-32 займет строка UTF-8.

Например, строка UTF-8 "¥0" равна 3 символам, а однажды преобразованная в UTF-32 - 2 беззнаковых целых. Есть ли какой-нибудь способ узнать количество "символов" UTF-32, которое мне понадобится перед преобразованием? Или мне придется переписать алгоритм?

1 ответ

Решение

Есть два основных варианта:

  1. Вы можете сделать два прохода через строку UTF-8, первый подсчитывает количество символов UTF-32, которые вам нужно сгенерировать, а второй фактически записывает их в буфер.

  2. Выделите максимальное количество 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;
}
Другие вопросы по тегам