2011-02-03 3 views
12

Я задаюсь вопросом, как нормализовать строки (содержащие utf-8/utf-16) в C/C++. В .NET есть функция String.Normalize.Нормализация строки Unicode в C/C++

Я использовал UTF8-CPP в прошлом, но не предоставляет такую ​​функцию. ICU и Qt обеспечивают нормализацию строки, но я предпочитаю легкие решения.

Есть ли для этого «легкое» решение?

ответ

8

Как я писал в another question, utf8proc - очень хорошая, легкая библиотека для базовых функций Unicode, включая нормализацию строки Unicode.

+0

У меня проблемы с визуальной студией 2010 с utf8proc. typedef unsigned char bool; -> dosen't компилировать в C++ –

+0

У меня нет знакомства с VS 2010, но вы не можете скомпилировать библиотеку как библиотеку C и связать ее таким образом? – Avi

+0

Проблема заключается в файле заголовка, поэтому мы не можем использовать его даже в качестве статической библиотеки. Простым обходным решением является замена bool, true, false на _bool, _true, _false вхождения. Пример: typedef unsigned char _bool; enum {_false, _true}; –

1

«Легкий» в вашем контексте означает «с ограниченной функциональностью». Я хотел бы использовать источник ICU в качестве примера и ссылку http://unicode.org/reports/tr15/ для реализации этой «облегченной» функциональности.

2

Вы можете построить ICU с минимальными (или, возможно, другими данными - я думаю, что все данные нормализации теперь являются внутренними), а затем статически связаны. Я не пробовал это недавно, но я считаю, что общий размер в этом случае довольно мал.

3

Для Windows есть NormalizeString() функция (к сожалению, для Vista, а затем только - насколько я вижу на MSDN):

http://msdn.microsoft.com/en-us/library/windows/desktop/dd319093%28v=vs.85%29.aspx

Это самый простой путь, что я нашел до сих пор , Я думаю, это тоже очень легкий вес.

int NormalizeString(
    _In_  NORM_FORM NormForm, 
    _In_  LPCWSTR lpSrcString, 
    _In_  int  cwSrcLength, 
    _Out_opt_ LPWSTR lpDstString, 
    _In_  int  cwDstLength 
); 
1

Хорошее решение UTF-8 - это функция g_utf8_normalize() glib. Потребуется преобразовать std :: wstring в std :: string (utf16 в utf8), если вам это тоже нужно для wstring (что сделало бы это довольно дорогостоящим решением, поэтому я ищу лучшее решение, если возможно, с чистым C++ (11) означает).

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