Нормализация строки Unicode в C / C ++ - PullRequest
14 голосов
/ 03 февраля 2011

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

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

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

Ответы [ 5 ]

10 голосов
/ 03 февраля 2011

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

3 голосов
/ 01 марта 2013

Для 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
);
2 голосов
/ 05 февраля 2011

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

1 голос
/ 05 июля 2015

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

1 голос
/ 03 февраля 2011

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

...