规范的Unicode字符串形式
Canonical Unicode string form
我有一个编码为UTF8
的Unicode字符串。Unicode中的一个字符串可以有几个字节的表示形式。我想知道,是否存在或可以创建任何规范(规范化)形式的Unicode字符串——因此我们可以将这些字符串与memcmp(3)
等进行比较。例如,ICU或任何其他C/C++
库可以做到这一点吗?
您可能正在寻找Unicode规范化。本质上有四种不同的正规形式,每种形式都确保所有等价字符串之后都有一个共同的形式。然而,在许多情况下,您也需要考虑区域设置,因此,尽管这可能是一种进行字节对字节比较的廉价方法(如果您确保相同的Unicode转换格式,如UTF-8或UTF-16和相同的普通形式),但除了这种有限的用例外,它不会给您带来太多好处。
比较Unicode码点序列:
UTF-8本身就是一种规范表示。由相同Unicode代码点组成的两个Unicode字符串将始终被编码为完全相同的UTF-8字节序列,因此可以与memcmp
进行比较。它是UTF-8编码的必要属性,否则它将不容易解码。但我们可以更进一步,这适用于所有官方的Unicode编码方案,UTF-8、UTF-16和UTF-32。它们将字符串编码为不同的字节序列,但总是将同一字符串编码为同一序列。如果考虑端序性和平台独立性,UTF-8是推荐的编码方案,因为在读取或写入16位或32位值时不必处理字节顺序。
因此,答案是,如果两个字符串使用相同的编码方案(例如UTF-8)和endiannes(UTF-8不是问题)进行编码,则得到的字节序列将是相同的。
比较Unicode字符串:
还有一个问题更难处理。在Unicode中,一些字形(你在屏幕或纸上看到的字符)可以用一个代码点或两个连续代码点的组合来表示(称为组合字符)。这通常适用于带有重音符号、变音符号等的字形。由于代码点表示的不同,它们对应的字节序列也会不同。在考虑这些组合字符的同时比较字符串不能用简单的字节比较来执行,首先必须对其进行规范化
其他答案提到了一些Unicode规范化技术、规范形式和库,您可以使用这些技术将Unicode字符串转换为正常形式。然后,您将能够将它们与任何编码方案逐字节进行比较。
您希望将字符串规范化为Unicode规范化形式之一。libicu可以为您做到这一点,但不能使用UTF-8字符串。您必须首先使用例如ucnv_toUChars
将其转换为UChar,然后使用unorm_normalize
进行规范化,再使用ucnv_fromUChars
进行转换。我认为还有一些特定版本的ucnv_*用于UTF-8编码。
如果memcmp是您唯一的目标,那么您当然可以在unorm_normalize
之后直接在UChar数组上执行此操作。
- 如何将unicode字符串从C++传递到delphi
- 将ANSI C字符串转换为UNICODE
- 将 unicode 字符串与 c ++ 符号进行比较?
- 如何在 c++ 中读取用 utf-8 编码的 java unicode 字节字符串
- C++:Unicode 字符串文字的可移植性
- 如何使用 CTypes 将 wchar_t** - 以空结尾的 UNICODE 字符串数组 - 返回到 Python 脚
- 在将 unicode 替换为C++字符串中的空格时出现分段错误
- C++ 原始字符串 Unicode 文字
- Xamarin Android:在 C++ 中将字符串从 C# 封送到 Unicode 字符串的正确方法是什么?
- 如何在 python 包装中使用 unicode 字符串用于带有 cython 的 c++ 类?
- 六角字符串到UTF-8(UNICODE)字符串
- 如何使用poco :: logger记录Unicode字符串
- 将 Unicode 字符/字符串写入文件
- 如何将 Unicode 字符串连接成字符串以传递到 mysql 调用中
- 从终端 C++ 中的字符串中打印出 unicode 字符
- Unicode字符串Visual C 构造函数
- 字符串到 Unicode,Unicode 到十进制码位 (C++)
- 如何让 SWIG 返回 Python 2 中字符串的 unicode 对象
- 如何将 (ICU4C) Unicode 字符串逐个字符复制到另一个 Unicode 字符串
- 如何从Windows中的进程中读取Unicode字符串