16

我想知道如何在 C/C++ 中规范化字符串(包含 utf-8/utf-16)。在 .NET 中有一个函数String.Normalize

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

有什么“轻量级”的解决方案吗?

4

5 回答 5

11

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

于 2011-02-03T10:25:04.313 回答
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
);
于 2013-03-01T04:45:31.087 回答
2

你可以用最少的(或者可能没有其他数据——我认为所有的标准化数据现在都是内部的)来构建 ICU,然后静态链接。我最近没有尝试过,但我相信在这种情况下总尺寸很小。

于 2011-02-05T01:10:14.280 回答
1

在您的上下文中,“轻量级”是指“功能有限”。我将以 ICU 源代码为例,并参考http://unicode.org/reports/tr15/来实现这个“轻量级”功能。

于 2011-02-03T10:39:40.847 回答
1

一个好的 UTF-8 解决方案是 glib 的g_utf8_normalize()函数。如果您也需要将它用于 wstring,则需要将 std::wstring 转换为 std::string(utf16 到 utf8)(这将使其成为一个非常昂贵的解决方案,因此我正在寻找一个更好的解决方案,如果可能的话纯C++(11) 表示)。

于 2015-07-05T12:54:05.017 回答