【发布时间】:2011-10-25 20:12:54
【问题描述】:
我一直在 Windows 中使用“unicode 字符串”……我已经了解了 Unicode(例如,毕业后)。然而,Win32API 非常松散地提到“unicode”总是让我感到困惑。特别是,MSN 提到的“unicode”变体是 UTF-16(尽管“宽字符”术语来自它曾经是 UCS-2,而不是 Unicode)。但是,它几乎没有提到 Unicode 规范化。
MSN 有几页关于Unicode 和Unicode Normalization Forms 以及change the normalization form 的功能。规范化页面甚至说:
Win32 和 .NET Framework 支持所有四种规范化形式。
但是,我在文档中的任何地方都没有找到 Win32 API 使用(或理解)什么规范化形式。
问题一:用户输入(如Edit控件)和通过MultiByteToWideChar()转换默认使用什么规范化形式?
问题 2:传递给 Win32API 函数的字符串必须采用特定的规范化形式,还是与内核和文件系统规范化无关?
【问题讨论】:
-
我认为您的 Q1 与不相关的想法混为一谈:转换函数仅在同一逻辑字符串的 unicode 代码点(例如 UTF8 和 UTF16)的不同二进制表示之间转换。但是,规范化是一个高级概念,仅涉及代码点的逻辑序列。两者没有任何关系。特别是,
MultiByteToWideChar只会为您提供与您输入它相同的代码点序列,只是采用不同的编码。我想这也回答了 Q2。 -
确实,
MultiByteToWideChar()的文档说它只是直接映射任何输入。来自备注部分:“考虑在使用 MultiByteToWideChar 转换后调用 NormalizeString。NormalizeString 提供更准确、标准和一致的数据,并且还可以更快。” -
@KerrekSB:很抱歉恢复这个非常古老的线程,但我今天再次偶然发现它并重新阅读了您的评论。问题是,您假设 UTF-8 到 UTF-16 转换,
MultiByteToWideChar允许使用CP_ACP转换为 UTF-16,其中可能包含一些具有多个代码点和规范化形式的非 ASCII 字符(例如é)。
标签: windows unicode normalization unicode-normalization