Unicode
Unicode 是一种全球字符编码标准。 系统专门使用 Unicode 进行字符和字符串操作。 有关 Unicode 所有方面的详细说明,请参阅 Unicode 标准版。
与处理字符和字符串数据的旧机制相比,Unicode 简化了软件本地化并改进了多语言文本处理。 通过使用 Unicode 在应用程序中表示字符和字符串数据,可以使用单个二进制文件对每个可能的字符代码启用全球营销的通用数据交换功能。 Unicode 执行以下操作:
- 允许从脚本和语言的任意组合中提取的任意字符组合在单个文档中共存。
- 定义每个字符的语义。
- 标准化脚本行为。
- 为双向文本提供标准算法。
- 定义与其他标准的交叉映射。
- 定义其单字符集的多个编码:UTF-7、UTF-8、UTF-16 和 UTF-32。 这些编码之间的数据转换是无损的。
Unicode 支持世界各地的语言使用的大量脚本,以及发布中使用的大量技术符号和特殊字符。 支持的脚本包括但不限于拉丁文、希腊文、西里尔文、希伯来文、阿拉伯语、德瓦纳加里文、泰语、汉文、朝鲜文、平假名和片假名。 支持的语言包括但不限于德语、法语、英语、希腊语、俄语、希伯来语、阿拉伯语、印地语、泰语、中文、韩语和日语。 Unicode 目前可以代表全球现代计算机使用的绝大多数字符,并且会不断更新以使其更加完整。
已启用 Unicode 的函数在 函数原型的约定中介绍。 这些函数使用 UTF-16 (宽字符) 编码,这是 Unicode 最常见的编码,也是 Windows 操作系统上用于本机 Unicode 编码的编码。 每个代码值为 16 位宽,这与使用 8 位代码值的字符和字符串数据的旧 代码页 方法不同。 使用 16 位允许直接编码 65,536 个字符。 事实上,用于转录人类语言的符号范围甚至大于这一点,U+D800 到 U+DFFF 范围内的 UTF-16 码位用于形成代理项对,构成补充字符的 32 位编码。 有关进一步讨论 ,请参阅代理项和补充字符 。
Unicode 字符集包含许多组合字符,例如 U+0308 (“ー”) 、组合二元或 umlaut。 Unicode 通常可以在“composed”或“decomposed”窗体中表示相同的字形:例如,“Ä”的合成形式是单个 Unicode 码位“Ä” (U+00C4) ,而其分解形式为“A”+ “ー” (U+0041 U+0308) 。 Unicode 不为每个字形定义组合形式。 例如,带有字形和波形符 (“ỗ”) 的越南语小写“o”由 U+006f U+0302 U+0303 (o + 音调 + Tilde) 表示。 有关组合字符和相关问题的进一步讨论,请参阅 使用 Unicode 规范化来表示字符串。
为了与 8 位和 7 位环境兼容,Unicode 也可以分别编码为 UTF-8 和 UTF-7。 虽然 Windows 中启用了 Unicode 的函数使用 UTF-16,但也可以使用在 UTF-8 或 UTF-7 中编码的数据,这些数据在 Windows 中支持多字节字符集 代码页。
新的 Windows 应用程序应使用 UTF-16 作为其内部数据表示形式。 Windows 还提供对代码页的广泛支持,并且可以在同一应用程序中混合使用。 即使是基于 Unicode 的新应用程序,有时也不得不使用代码页。 代码页中讨论了此问题的原因。
应用程序可以使用 MultiByteToWideChar 和 WideCharToMultiByte 函数根据代码页和 Unicode 字符串在字符串之间进行转换。 尽管它们的名称引用“MultiByte”,但这些函数同样适用于 单字节字符集 (SBCS) 、 双字节字符集 (DBCS) 和多字节字符集 (MBCS) 代码页。
通常,Windows 应用程序应在内部使用 UTF-16,仅作为必须使用其他格式的接口上的“精简层”的一部分进行转换。 此方法可防范数据丢失和损坏。 每个代码页都支持不同的字符,但其中没有一个支持 Unicode 提供的全系列字符。 大多数代码页支持不同的子集,编码方式不同。 UTF-8 和 UTF-7 的代码页是一个例外,因为它们支持完整的 Unicode 字符集,并且这些编码与 UTF-16 之间的转换是无损的。
从一个代码页使用的编码直接转换为另一个代码页使用的编码的数据可能会损坏,因为不同代码页上的相同数据值可以编码不同的字符。 即使应用程序尽可能靠近接口进行转换,也应该仔细考虑要处理的数据范围。
从 Unicode 转换为代码页的数据可能会丢失数据,因为给定的代码页可能无法表示该特定 Unicode 数据中使用的每个字符。 因此,请注意,如果目标代码页无法表示 Unicode 字符串中的所有字符, WideCharToMultiByte 可能会丢失一些数据。
将基于代码页的旧版应用程序现代化为使用 Unicode 时,可以使用泛型函数和 TEXT 宏来维护一组源,以便从中编译应用程序的两个版本。 一个版本支持 Unicode,另一个版本支持 Windows 代码页。 使用此机制,甚至可以将非常大的应用程序从 Windows 代码页转换为 Unicode,同时维护可在转换的所有阶段编译、生成和测试的应用程序源。 有关详细信息,请参阅 函数原型的约定。
Unicode 字符和字符串使用的数据类型与基于代码页的字符和字符串的数据类型不同。 除了一系列宏和命名约定之外,这种区别可最大程度地减少意外混合两种类型的字符数据的可能性。 它有助于编译器类型检查,以确保仅将 Unicode 参数值用于需要 Unicode 字符串的函数。
相关主题