Нормализация строки Unicode в C/C++
Интересно, как нормализовать строки (содержащие utf-8/utf-16) в C/C++. В.NET есть функция String.Normalize.
Я использовал UTF8-CPP в прошлом, но он не предоставляет такой функции. ICU и Qt обеспечивают нормализацию строк, но я предпочитаю легкие решения.
Есть ли "легкое" решение для этого?
5 ответов
Как я писал в другом вопросе, utf8proc - это очень хорошая, легкая библиотека для базовых функций Unicode, включая нормализацию строк Unicode.
Для 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
);
Хорошим решением UTF-8 является функция glib g_utf8_normalize(). Потребуется преобразовать std:: wstring в std::string (utf16 в utf8), если вам это нужно и для wstring (что может сделать это довольно дорогим решением, поэтому я ищу себе лучшее решение, если возможно с чистым C++(11) означает).
Вы могли бы построить ICU с минимальным (или, возможно, без других данных - я думаю, что все данные нормализации теперь внутренние), а затем статически связать. Я не пробовал это в последнее время, но я считаю, что в этом случае общий размер довольно мал.
"Легкий" в вашем контексте означает "с ограниченной функциональностью". Я хотел бы использовать источник ICU в качестве примера и ссылаться на http://unicode.org/reports/tr15/ для реализации этой "легкой" функциональности.