代码页

目前编写的大多数应用程序主要使用 UTF-16 编码处理字符数据 Unicode。 但是,许多旧版应用程序继续使用基于代码页的字符集。 即使是新的应用程序有时也不得不使用代码页,通常出于以下原因之一:

  • 与旧版应用程序通信。
  • 若要与较旧的邮件和新闻服务器通信,可能并不总是支持 Unicode。
  • 为了传统目的与 Windows 控制台通信。 (控制台确实支持 Unicode,但某些旧版命令行应用程序工具可能不支持。

注意

新的 Windows 应用程序应使用 Unicode 以避免不同代码页的不一致以及便于本地化。

 

每个代码页由代码页标识符(例如 1252)表示,由 Unicode 和字符集 API 函数处理。 有关受支持的代码页标识符的列表,请参阅 代码页标识符。 Microsoft Go 全局开发人员中心 的“代码页”参考提供了许多代码页的完整说明。

Windows 代码页通常称为“ANSI 代码页”,是非 ASCII 值(大于 127 的值)表示国际字符的代码页。 这些代码页在 Windows Me 中本机使用,在 Windows NT 及更高版本上也可用。

注意

最初,Windows 代码页 1252(通常用于英语和其他西欧语言的代码页)基于美国国家标准研究所(ANSI)草案。 该草案最终成为 ISO 8859-1,但 Windows 代码页 1252 在标准成为最终版本之前实施,与 ISO 8859-1 并不完全相同。

 

许多 Windows API 函数具有“A”(ANSI)和“W”(宽、Unicode)版本。 “A”版本基于 Windows 代码页处理文本,而“W”版本处理 Unicode 文本。 请参阅 字符串 的 Windows 数据类型,以及函数原型 约定。

Windows 代码页有时也称为“活动代码页”或“系统活动代码页”。 Windows作系统始终有一个当前处于活动状态的 Windows 代码页。 所有 ANSI 版本的 API 函数 都使用当前活动代码页。

原始设备制造商(OEM)代码页是非 ASCII 值表示线条绘制和标点符号字符的代码页。 这些代码页最初用于 MS-DOS,仍用于控制台应用程序。 它们还用于 FAT12、FAT16 和 FAT32 文件系统中的非扩展文件名,如 文件名中使用的字符集中所述。 英语的通常 OEM 代码页是代码页 437。

对于 Windows 代码页和 OEM 代码页,通过0x7F 0x00的代码值对应于 7 位 ASCII 字符集。 通过0x19 0x00代码值,0x7F始终表示标准化的控制字符,0x20通过0x7E表示标准化的可显示字符。 其余代码(0x80到0xff)表示的字符因字符集而异。 每个字符集包括不同的特殊字符,通常针对一种语言或一组语言进行自定义。 Windows 代码页 1252 和 OEM 代码页 437 通常用于美国。

除了 Windows 和 OEM 代码页,应用程序还可以使用非本机代码页。 示例包括 EBCDIC 和 Macintosh 代码页。

Unicode(UTF-7 和 UTF-8)的两种编码作为代码页实现。 与其他代码页一样,每个页面都是由数字标识符知道的,并且可以使用许多相同的 Unicode 和字符集 API 函数进行处理。

代码页可以是 单字节字符集(SBCS)页,也可以 双字节字符集(DBCS)页。 在 SBCS 页面中,每个字节直接编码单个字符,以便可以准确表示 256 个不同的字符(包括控制字符、字母、数字、标点符号、符号等)。 DBCS 代码页用于日语和中文等语言。 在此类代码页中,某些字符具有具有特定字节值的双字节编码(始终大于 127 的值)作为“潜在字节”。 前导字节只能与“尾随字节”一起映射到字符,而不是自行对字符进行编码。

某些旧协议需要使用 SBCS 和 DBCS 代码页。 每个 SBCS/DBCS 代码页都支持不同的字符,但没有代码页支持 Unicode 提供的完整字符范围。 每个 SBCS/DBCS 代码页都支持不同的子集,以不同的编码方式。

注意

从一个 SBCS 或 DBCS 代码页转换为另一个代码页的数据可能会损坏,因为不同代码页上的相同数据值可以编码不同的字符。 从 Unicode 转换为 SBCS 或 DBCS 的数据可能会丢失数据,因为给定的代码页可能无法表示该特定 Unicode 数据中使用的每个字符。

 

除了 SBCS 和 DBCS 代码页,应用程序还具有多字节字符集代码页 52936、54936、51949 和 5022x,使用与 DBCS 类似的方法。 但是,多字节字符集代码页超出了某些字符的双字节编码。 UTF-7 和 UTF-8 使用类似的方法来基于 7 位和 8 位字节对 Unicode 进行编码。 有关详细信息,请参阅 Unicode

多个 Unicode 和字符集函数允许应用程序处理代码页。 应用程序可以使用 GetCPInfoGetCPInfoEx 函数来获取有关代码页的信息。 此信息包括转换后的字符串中的字符在代码页中没有相应条目时使用的默认字符。

应用程序可以使用 MultiByteToWideCharWideCharToMultiByte 函数基于 Windows 代码页和 Unicode 字符串在字符串之间转换。 尽管它们的名称引用了“MultiByte”,但这些函数同样适用于 SBCS、DBCS 和多字节字符集代码页。

注意

如果提供的代码页不能表示 Unicode 字符串中的所有字符,则 WideCharToMultiByte 可能会丢失一些数据。

 

应用程序可以使用标准 C 运行时库函数在 Windows 代码页和 OEM 代码页之间转换。 但是,使用这些函数会带来数据丢失的风险,因为每个代码页可以表示的字符不匹配。

应用程序还可以调用 GetACP 函数。 此函数检索当前 Windows (ANSI) 代码页的标识符。

字符集