代码页

目前编写的大多数应用程序主要使用 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 代码页转换为另一个 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) 代码页的标识符。

字符集