Подтвердить что ты не робот

Нормализация строки Юникода в C/С++

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Для 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
);

Ответ 3

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

Ответ 4

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

Ответ 5

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