2012-05-24 6 views
2

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

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

ответ

7

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

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

+1, один комментарий: После того, как вариант 2 вы можете 'realloc' массив UTF-32, если он был выделен с помощью' таНоса 'прежде. Таким образом, вы не теряете память, в идеале. – quinmars

+0

@quinmars Правда. Независимо от того, что стоит делать, может зависеть от того, как долго вы намерены поддерживать строку utf32; если вы будете держать его на некоторое время, тогда стоит попытаться уменьшить его. Если вы собираетесь использовать его, а затем освободите его быстрее, то это может не стоить того. –

+1

Я бы пошел с опцией №1 сам. Это немного больше кода и немного больше времени для запуска, но он имеет преимущество, позволяя первому проходу проверить вход, чтобы убедиться, что он действителен UTF-8 при подсчете, до этого выделяя любую память для второго прохода , –

 Смежные вопросы

  • Нет связанных вопросов^_^