Unicode
Unicode 是一种全球字符编码标准。 系统专门使用 Unicode 进行字符和字符串作。 有关 Unicode 的各个方面的详细说明,请参阅 Unicode 标准。
与处理字符和字符串数据的较旧机制相比,Unicode 简化了软件本地化并改进了多语言文本处理。 通过使用 Unicode 来表示应用程序中的字符和字符串数据,可以为全局营销启用通用数据交换功能,为每个可能的字符代码使用单个二进制文件。 Unicode 执行以下作:
- 允许从脚本和语言的任意组合中提取的任意字符组合在一个文档中共存。
- 定义每个字符的语义。
- 标准化脚本行为。
- 为双向文本提供标准算法。
- 定义与其他标准的交叉映射。
- 定义其单字符集的多个编码:UTF-7、UTF-8、UTF-16 和 UTF-32。 这些编码中的数据转换是无损失的。
Unicode 支持世界各地的语言使用的众多脚本,以及发布中使用的大量技术符号和特殊字符。 支持的脚本包括但不限于拉丁语、希腊文、西里尔文、希伯来语、阿拉伯语、Devanagari、泰文、汉语、朝鲜文、平假名和片假名。 支持的语言包括但不限于德语、法语、英语、希腊语、俄语、希伯来语、阿拉伯语、印地语、泰语、中文、朝鲜语和日语。 Unicode 目前可以代表全球现代计算机使用的绝大多数字符,并继续更新,使其更加完整。
已启用 Unicode 的函数在函数原型 的约定中介绍。 这些函数使用 UTF-16(宽字符)编码,这是 Unicode 的最常见编码,也是用于 Windows作系统上的本机 Unicode 编码的编码。 每个代码值宽 16 位,与较旧的 代码页相比, 使用 8 位代码值的字符和字符串数据的方法。 使用 16 位允许直接编码 65,536 个字符。 事实上,用于转录人类语言的符号的宇宙甚至大于这一点,U+D800 到 U+DFFF 的范围中的 UTF-16 码位用于形成代理项对,构成补充字符的 32 位编码。 有关进一步讨论,请参阅 代理项和补充字符。
Unicode 字符集包括许多组合字符,例如 U+0308(“2”),组合二进制字符或 umlaut。 Unicode 通常可以在“'composed'”或“'decomposed'”窗体中表示相同的标志符号:例如,“Ä”的组成形式是单一 Unicode 码位“Ä”(U+00C4),而其分解形式为“A”+ “”(U+0041 U+0308)。 Unicode 不为每个字形定义组合形式。 例如,带扬反射和波形符(“ỗ”)的越南小写“o”由 U+006f U+0302 U+0303(o + 扬反射 + 波形符)表示。 有关合并字符和相关问题的进一步讨论,请参阅 使用 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 字符串的函数。
相关主题