2010-06-08 2 views
1

Любой знают более разрешающей лицензии (MIT/общественное достояние) версия этого:C++ UTF-8 легкий и разрешительный код?

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

('капля в' замена станда :: строка то будет UTF-8 известен)

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

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

ответ

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

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

Это не но он позволяет обрабатывать Unicode правильно и использует std::string как storeag е.

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

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

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

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

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

2) обнаружение линии разрыв

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

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

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

3) символов (или в настоящее время, код точки) подсчета Глядя на utfcpp ТНХ

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

Итак, если вы знаете об этих проблемах, то utfcpp будет в порядке, иначе вы не найдетенайти что-нибудь более простое.

+0

", и если вы ожидаете найти удобную библиотеку Unicode для работы с нитками, вы не найдете таких вещей » Кроме того, я сделал - как связанный, но, увы, его GPL ... « ...И даже «простые» вещи, как прописные, преобразование строчного или нормализация ...» Нам я определенно не нужны такие вещи, как этот Я думаю, что я только заглянуть внутрь моей станд :: строки в: 1) Найти форматы файлов для файлов, включенных мной (так, его определенно «.png» «.jpg», в нижнем регистре, когда я его отправил) 2) Обнаружение разрыва линии 3) Персонаж (или сейчас, кодовая точка) counting Посмотрите на utfcpp thx! – xenthral

+0

@xenthral Посмотрите мой ответ – Artyom

+1

на 2) - да, я знал, что обнаружение разрыва строки может потерпеть неудачу, поэтому я убедился, что в худшем случае se просто сломал все, что мог, так что это не проблема. 3) Упс, я немного потерялся на жаргоне, спасибо за исправление. Подумайте, что utfcpp будет в порядке. – xenthral

2

Вас может заинтересовать Flexible and Economical UTF-8 Decoder от Björn Höhrmann, но это не замена, а замена на std::string.

+0

std :: wstring проще и эффективнее, если вы работаете в Windows, на остальных платформах std :: string и UTF-8 - правильный путь. – Artyom

+0

Да, UTF-16 дал бы мне больше проблем, чем решений. Глядя на гибкий декодер UTF-8, хотя, спасибо :) – xenthral

+0

@Artyom, за исключением того, что сохранение байтов UTF-8 в 'std :: string' не приводит к тому, что класс правильно учитывает символы, тогда как' std :: wstring' работает –

2

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

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