C/C++ で文字列 (utf-8/utf-16 を含む) を正規化する方法を知りたいです。.NET には、関数String.Normalizeがあります。
以前は UTF8-CPP を使っていましたが、そのような機能はありません。 ICUと Qt は文字列の正規化を提供しますが、私は軽量のソリューションを好みます。
これに対する「軽量」ソリューションはありますか?
C/C++ で文字列 (utf-8/utf-16 を含む) を正規化する方法を知りたいです。.NET には、関数String.Normalizeがあります。
以前は UTF8-CPP を使っていましたが、そのような機能はありません。 ICUと Qt は文字列の正規化を提供しますが、私は軽量のソリューションを好みます。
これに対する「軽量」ソリューションはありますか?
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
);
最小限のデータでICUを構築し(または、他のデータがない場合、すべての正規化データが内部にあると思います)、静的にリンクすることができます。最近は試していませんが、その場合は全体のサイズがかなり小さいと思います。
あなたのコンテキストでの「軽量」は、「機能が制限されている」ことを意味します。ICU ソースを例として使用し、 http: //unicode.org/reports/tr15/を参照してこの「軽量」機能を実装します。
優れた UTF-8 ソリューションは、glib のg_utf8_normalize()関数です。wstringにもこれが必要な場合は、std::wstringをstd::string(utf16からutf8に)に変換する必要があります(これは非常に高価なソリューションになるため、可能であれば純粋なC++(11) の意味)。