C/C++中的Unicode字符串规范化

18

我想知道如何在C/C++中规范化包含utf-8/utf-16的字符串。

.NET中有一个名为String.Normalize的函数。

我以前使用过UTF8-CPP,但它并没有提供这样的函数。 ICU和Qt提供了字符串规范化功能,但是我更喜欢轻量级的解决方案。

是否有任何“轻量级”的解决方案呢?

5个回答

11

正如我在另一篇问题中所写的,utf8proc是一个非常好的,轻量级的库,用于基本的Unicode功能,包括Unicode字符串规范化。


我在Visual Studio 2010中使用utf8proc遇到了问题。 typedef unsigned char bool; -> 在C++中无法编译。 - Ghassen Hamrouni
我对VS 2010不熟悉,但是你不能把这个库编译成C语言库然后以这种方式链接吗? - Avi
问题出在头文件上,所以我们无法将其作为静态库使用。 一个简单的解决方法是将bool、true和false替换为_bool、_true和_false。 例如: typedef unsigned char _bool; enum {_false, _true}; - Ghassen Hamrouni
是的,你可能不需要太多麻烦就能完成这个 - 它并不是一个非常复杂的库。我们也不得不做一两个类似的小改动。 - Avi
2
Julia团队有一个更新的utf8proc分支,称为libmojibake(https://github.com/JuliaLang/libmojibake),它已经更新以支持Unicode 7。(它还有一些其他小修复,例如修复了C++兼容性问题。) - Steven G. Johnson

4

对于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
一个好的UTF-8解决方案是glib的g_utf8_normalize()函数。如果你需要对wstring进行操作,就需要将std::wstring转换为std::string(utf16到utf8),这会使得它成为一种相当昂贵的解决方案,因此我正在寻找更好的解决方案,如果可能的话,使用纯C++(11)手段。

2

您可以使用最小的(或可能没有其他数据 - 我认为所有规范化数据现在都是内部的)构建ICU,然后静态链接。我最近没有尝试过这个,但我相信在这种情况下总大小相当小。


1
在你的上下文中,“轻量级”意味着“具有有限功能”。我会以 ICU 源代码为例,并参考 http://unicode.org/reports/tr15/ 来实现这种“轻量级”功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接