C ++ UTF-8 легкий и разрешающий код? - PullRequest
1 голос
/ 08 июня 2010

Кто-нибудь знает о более разрешительной версии лицензии (MIT / public domain):

http://library.gnome.org/devel/glibmm/unstable/classGlib_1_1ustring.html

(замена 'drop-in' для std :: string, которая поддерживает UTF-8)

Легкий, делает все, что мне нужно, и даже больше (сомневаюсь, я даже буду использовать преобразования UTF-XX)

Я действительно не хочу носить с собой ICU.

Ответы [ 3 ]

7 голосов
/ 08 июня 2010
  1. std :: string подходит для хранилища UTF-8.
  2. Если вам нужно проанализировать сам текст, осведомленность о UTF-8 не сильно вам поможет, поскольку в ней слишком много всегоUnicode, которые не работают на базе кодовых точек.

Взгляните на библиотеку Boost.Locale (она использует ICU под капотом):

Оно не легкое, но позволяет правильно обрабатывать Unicode и использует std::string в качестве хранилища.

Если вы ожидаете найти легковесную библиотеку с поддержкой Юникода для работы со строками, вы не найдете таких вещей, потому что Юникод не является легковесным.И даже относительно «простые» вещи, такие как преобразование в верхний регистр, преобразование в нижний регистр или нормализация Unicode, требуют сложных алгоритмов и доступа к базе данных Unicode.

Если вам нужна возможность перебирать точки кода (эти BTW1025 * не символов) посмотрите http://utfcpp.sourceforge.net/

Ответ на комментарий:

1) Найдите форматы файлов для включенных мной файлов

std :: string :: find отлично подходит для этого.

2) Обнаружение разрыва строки

Это не простовопрос.Вы когда-нибудь пытались найти разрыв строки в китайском / японском тексте?Наверное, нет, так как пространство не разделяет слова.Так что обнаружение разрыва строки - тяжелая работа.(Я не думаю, что даже glib делает это правильно, я думаю, что только в pango есть что-то подобное)

И, конечно, Boost.Locale делает это и правильно.

И если вам нужно сделатьэто только для европейских языков, просто ищите пробел или знаки препинания, поэтому std::string::find более чем хорошо.

3) Подсчет символов (или теперь кодовая точка) Глядя на utfcpp thx

Символы не являются кодовыми точками, например, еврейское слово Shalom - «שָלוֹם» состоит из 4 символов и 6 Unicode-точек, где для кодовых гласных используются две кодовые точки.То же самое для европейских языков, где одиночный символ представлен двумя кодовыми точками, например: «ü» может быть представлен как «u», а «¨» - двумя кодовыми точками.

Так что, если вам известно оэти проблемы, то с utfcpp все будет в порядке, иначе вы не найдете ничего проще.

2 голосов
/ 08 июня 2010

Я никогда не использовал, но наткнулся на эту библиотеку UTF-8 CPP некоторое время назад, и у меня было достаточно хороших чувств, чтобы добавить ее в закладки.Он выпущен на BSD-подобной лицензии IIUC.

Он по-прежнему полагается на std::string для строк и предоставляет множество вспомогательных функций, помогающих проверить, что строка действительно является UTF-8, для подсчета количества символов,вернуться назад или вперед на один символ ... Он очень маленький, живет только в заголовочных файлах: выглядит действительно хорошо!

2 голосов
/ 08 июня 2010

Вас может заинтересовать Гибкий и экономичный декодер UTF-8 от Björn Höhrmann, но отнюдь не замена для std::string.

...