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


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

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

1 2

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;
}