2.5. 代码页Code Page

2.5.1. 什么是代码页(Code Page)

Code Page,是字符编码的另一种说法。

Code Page包含了一个表,表中的值,用于表示针对某种语言所用的字符集。

更简单点说,就是Code Page中,用一个数字编号,表示了所要采用何种字符编码,去编解码相应的值,用于正确显示出相应的字符。

Code Page这一概念,源于IBM,后被其他常见广泛采用,包括Microsoft,SAP,Oracle等。

这些常见,各自定义了一套自己的Code Page,给每一个code page号,指定一个字符编码。

比如,对于众所周知的UTF-8编码,在IBM的Code Page中编号是1208,在微软中是65001,在SAP中是4110。

接下来,主要介绍大家最常见的Windows的Code Page

2.5.2. Windows中的Code Page

如前所述,Windows中也有自己的一套Code Page的定义。

用对应的某个数字,Code Page Number,即Code Page中的标识符(Identifier),表示相应的字符编码。

而一般Code Page也常缩写为CP

比如,CP936表示GBK中文编码,CP65001表示UTF-8编码,CP54936表示GB18030编码,CP950表示BIG5繁体中文等等。

[提示] C#中使用当前系统默认编码处理字符

对于C#来说,处理字符时涉及可能在不同环境中使用的话,那么最好用系统默认编码:

StreamReader reader = new StreamReader(path, System.Text.Encoding.Default);

2.5.2.1. Windows中的Code Page分类:ANSI和OEM

Windows中的Code Page,按照引用领域来划分,可以分为两类:ANSI Code Page和 OEM Code Page

2.5.2.1.1. Windows的ANSI Code Page表

ANSI Code Page的官网正式叫法其实是Windows Code Page。但是由于ANSI Code Page被误用的太广泛了,索性微软也就接受了此叫法,然后就叫做ANSI Code Page了。

类似地,ANSI Code Page=ANSI Windows Code Page

[提示] Windows的Code Page为何被误称为ANSI Code Page

Windows的Code Page中用的最广泛的是Windows 1252,其用于英语和西欧语言字符。

Windows 1252是基于ANSI草案(ANSI draft)而设计的。

结果,本来叫做Windows Code Page,就被很多不熟悉的人误读为ANSI Code Page

而实际上,(作为标准制定者的)ANSI和ISO,都从来没有去标准化Windows的Code Page,即没有为Windows Code Page指定过任何标准。

但是呢,由于ANSI Code Page被误用的太普遍了,导致微软官方也都承认此叫法了。

总之,记住一点,ANSI Code Page,就是Windows Code Page,就行了。

ANSI Code Page主要是用于Windows系统中,本地编码是非Unicode的,图形用户界面(GUI)程序。

ANSI的Code Page相关的表格,参见第 A.3.1.1 节 “ANSI Code Page表”

2.5.2.1.2. Windows的OEM Code Page表

OEM Code Page主要是用于Windows系统中的命令行界面(console)程序,虚拟DOS。

OEM Code Page可以视为是DOS和IBM PC时代的(过渡)剩余产品。

除了ANSI Code Page之外,之所以又设计出一个OEM Code Page,是因为:

  1. 兼容性

    因为作为新的图形用户界面系统的Windows,也要兼容旧的命令行程序,即向后兼容性。

  2. 字体和硬件的要求

    字体和旧的VGA硬件建议,文字图形界面所用的编码,最好和Code Page 437兼容。

    多数的OEM的Code Page,和(非ASCII的)后半部分的CP437,都是公用同一套代码点(code point)的。

    一般的OEM Code Page的后半段编码,和ANSI Code Page,完全不同。不过,对于部分双字节编码的,定长的Code Page(如泰语的847,越南语的1258)和多字节CJK编码的Code Page(如932,936,949,950)来说,ANSI和OEM的Code Page,都用的同一套编码。

和OEM Code Page相关的表格,参见第 A.3.1.2 节 “OEM Code Page表”

2.5.2.1.3. 一些常见的Code Page表

其中,ANSI和OEM共有的一些Code Page,可参见第 A.3.1.3 节 “ANSI和OEM共有的Code Page表”

而其他一些常见的Code Page,可参见第 A.3.1.4 节 “其他一些常见的Code Page表”

2.5.2.2. 所有的Code Page表

除了ANSI和OEM,以及ANSI,OEM共有的Code Page之外,其他还有很多Code Page定义。

关于所有的Windows中的Code Page的定义,可在微软官网[21]中找到。

此处已收录至第 A.3.2 节 “所有的Code Page相关的表格”,以方便查阅。