|
现在大部分的应用程序主要使用 Unicode (使用 UTF-16 编码)来处理字符数据。然而,也还有许多旧的程序仍然使用基于代码页(code pages)的字符集。实际上,新的应用程序有时也不得不使用代码页,其可能原因可能出自于如下几点:
1. 能够和旧有的程序正常打交道
2. 需要和一些老的邮件和新闻服务器打交道,这些服务器可能并不支持 Unicode
3. 和不支持 Unicode 的 Windows 控制台打交道。
注意:新的 Windows 应用程序应该使用 Unicode,这样可以避免使用不同的代码页引起的非一致性,也能使程序的本地化变得更轻松些。
每一种代码页由一个代码页指示码来表示,比如 936,它表示简体中文所使用的 GB2312 。
Windows 代码页(通常称为 "ANSI Code pages") 用 非ASCII 值(通常的 ASCII 范围为 0-127,非 ASCII 是指大于 127 而小于 256 的值,它们是 ASCII 的一种扩展)来表示国家化字符。这些代码页从 Windows Me 开始使用,对于 Windows NT 或更高版本的 Windows 也同样适用。
注意,在开始时,Windows 代码页的指示码为 1252,这个代码页通常用于英语和西欧语言,它是 ANSI 的。后来,它最终变为 ISO 8859-1,但是 Windows 的 1252 代码页在变为最终标准之前实现的,所以它并不是很严格的等同于 ISO 8859-1 。
许多 Windows API 函数有 A(ANSI) 和 W(wide, Unicode) 两个版本。“A” 版本处理基于 Windows 代码页的文本,而 "W" 版本则处理基于 Unicode 文本。
Windows 代码页有时也被指为 “活动代码页(active code pages)" 或 "系统活动代码页(system active code pages)" 。一个 Windows 操作系统总是有一个当前活动的 Windows 代码页。
原设备制造商(OEM)的代码页用 非ASCII 值来表示线图和标点符号。这些代码页开始用于 MS-DOS 并仍然被控制台程序所使用。它们也用于 FAT12, FAT16 和 FAT32 里的非扩展文件名。通常 OEM 代码页使用 437 号英语代码页。
Windows 代码页和 OEM 代码页,它们的代码值从 0x00 到 0x7F,相应于低 7 位的 ASCII 字符集。代码值 0x00 到 0x19 和 0x7F 总是表示标准控制控制字符,0x20 到 0x7E 表示标准显示字符。其余的不同字符集由剩下的 0x80 到 0xFF 来表示。每一个字符集都包含了不同的特殊字符,这些都是为了一种语言或一组语言所定制。
除了Windows 和 OEM 代码页,在你的应用程序里也能使用非本地代码页,如 EBCDIC 和 Macintosh 代码页。
两种 Unicode 编码 (UTF-7 和 UTF-8) 也是以代码页形式所实现。像其他代码页,每一页都以一个数字指示码来标识,并且可以由许多相同的 Unicode 和 字符集API 函数进行处理。
代码页既可以是 SBCS(single-byte character set)页,也可以是 DBCS (double-byte character set) 页。在 SBCS 页里,每一个字节直接编码一个单字符,这样它就能准确的表示 256 个不同的字符(包括控制字符,字母,数字,标点符号等等)。DBCS 代码页被汉语和日语所使用。在这种代码页里,一些两字节编码的字符的值(总是大于 127)只由一个特定的字节来表示,这样的字节被称为 “前导字节”(lead bytes),而它另一半只起着连接映射作用的字节被称为“尾字节”(trail byte)。
一些老的协议要求使用 SBCS 和 DBCS 代码页。每一种 SBCS/DBCS 代码页支持不同的字符集,但没有哪种代码页可以支持和 Unicode 所支持同样多的字符。每一种 SBCS/DBCS 代码页支持的只是一个不同的子集以及不同的编码方式。
注意,数据从一种 SBCS 或 DBCS 代码页转换到另一种容易造成数据损坏,因为在不同代码页上的相同的数据值可以编码成一个不同的字符。数据从 Unicode 到 SBCS 或者 DBCS 的转换容易造成数据丢失,因为一个给定的代码页可能无法表示出由特定的 Unicode 所表示的每一个字符。
除了 SBCS 和 DBCS 代码页外,你的应用程序还有多字节字符集代码页可用(52696,54936,51949 以及 5022x)。一个多字节字符集代码页里的一些字符超出 2字节编码。然而,UTF-7 和 UTF-8 使用一种基于 7位 和 8位 字节的类似方法来编码 Unicode 。
几个 Unicode 和 字符集函数允许你的程序处理代码页。应用程序里可以使用 GetCPInfo() 和 GetCPInfoEx() 函数来获得代码页的相关信息。该信息包含了当一个在欲转换的字符串中的字符在代码页中没有相应的条目时所使用的默认字符。
应用程序可以使用 MultiByteToWideChar() 和 WideCharToMultiByte() 两个函数在基于 Windows 代码页的字符串和 Unicode 字符串之间进行转换。尽管他们的名字都引用了 "MultiByte" ,但这些函数同样能够很好的应用于 SBCS, DBCS 以及多字节字符集代码页上。
注意,如果代码页不能表示所有 Unicode 字符串种的字符,那么 WideCharToMultiByte() 会造成一些数据的丢失。
应用程序可以在 Windows 代码页和 OEM 代码页之间使用标准 C 运行时库函数进行转换。然而,使用这些函数会带来数据丢失的风险,因为由每一种代码页所表示的字符并总是准确的匹配。
应用程序也可以调用 GetACP() 函数。该函数获取当前 Windows (ANSI)代码页的指示符。 |
|