Как использовать ICU с UTF-16?

Я рассматриваю возможность использования ICU для обработки строк Unicode в собственном модуле Node.js, потому что мне кажется, что v8::String (согласно эти документы) не имеет C++ API для этой цели.

Насколько мне известно, V8 ожидает UTF-16 в ExternalStringResource и других API, поэтому я хотел бы использовать ICU для обработки UTF-16.
Мне особенно нужно:

  • Перебирать символы (а не только 16-битные единицы кода) строки UTF-16.
  • Сообщите количество символов (не только 16-битных кодовых единиц), которые содержит строка UTF-16.

Поэтому я просмотрел документацию ICU и нашел UnicodeString и CharacterIterator. Однако у UnicodeString нет метода fromUTF16, только fromUTF8 и fromUTF32.

Еще одна вещь, в которой я не уверен, копирует ли конструктор UnicodeString данные, которые я ему даю, или нет? Я бы очень предпочел использовать подход с нулевым копированием, когда я просто работал бы с неизменяемым объектом, поэтому он не должен выполнять никаких операций копирования, а просто использовать буфер, на который я указываю.

Я также не уверен, могу ли я просто использовать UCharIterator (при условии, что я могу каким-то образом преобразовать UChar* из моих строк UTF-16).

Итак, мой вопрос: Как мне использовать ICU для вышеуказанных целей?

Заранее спасибо за ваши ответы!


person Venemo    schedule 07.11.2013    source источник


Ответы (1)


UnicodeString по умолчанию использует UTF-16 для хранения. Вот почему у него есть только fromUTF8 и fromUTF32: из UTF-16 преобразование не требуется.

Он копирует данные. Это строка-владелец, очень похожая на std::string.

Вы можете использовать UCharIterator, если не хотите копировать данные. UChar – это 16-битное значение. Вы можете заставить его быть любым 16-битным типом, с которым вы предпочитаете работать, определив макрос UCHAR_TYPE:

Определите UChar как UCHAR_TYPE, если это #defined (например, для char16_t), или wchar_t, если он имеет ширину 16 бит; всегда считается беззнаковым.

Если ни один из них недоступен, определите UChar как uint16_t.

Это делает определение UChar зависимым от платформы, но обеспечивает прямую совместимость строкового типа с платформами с 16-битными типами wchar_t.

person R. Martinho Fernandes    schedule 07.11.2013
comment
Martinho, спасибо за ответ! :) Где документировано, что UCharIterator работает с UTF-16? Я не смог найти его в документах. - person Venemo; 08.11.2013
comment
@Venemo см. uiter_SetString. Он просто говорит, что перебирает строку, однако ICU API и документы часто принимают это просто за строку UTF-16 (для этого есть исторические причины; ICU существует уже давно). Вы можете видеть, что он использует UTF-16, потому что он принимает указатель на UChar. - person R. Martinho Fernandes; 08.11.2013
comment
Да, но я не смог найти его в документах, где говорится, что UChar означает кодовую единицу UTF-16. - person Venemo; 08.11.2013