1. Code Page 历史发展
此技术的使用最早追溯到 MS-DOS3.3(1987 年 4 月发行)向 IBMPC 用户引进了内码表的概念,Windows 也使用此概念。
最初的 IBM 字元集被称作内码表 437,或者(MS-DOSLatinUS)。内码表 850 就是「MS-DOSLatin1」,它用附加的带重音字母(但不是 Latin1ISO/ANSI 标准)代替了一些线形字符。
在 MS-DOS 中,如果用户为 PC 的键盘、显示卡和打印机指定了一个内码表,然后在 PC 上创建、编辑和打印文件,一切都很正常,每件事都会保持一致。然而,如果用户试图与使用不同内码表的用户交换文件,或者在机器上改变内码表,就会产生字符码与错误的字符相关联问题。应用程序能够将内码表信息与文件一起保存来试图减少问题的产生,但该策略包括了某些在内码表间转换的工作。
虽然内码表最初仅提供了不包括带重音符号字母的附加拉丁字符集,但最终内码表的较高的 128 个字符还是包括了完整的非拉丁字母,例如希伯来语、希腊语和斯拉夫语。自然,如此多样会导致内码表变得混乱。如果少数带重音的字母未正确显示,那么字符便会混乱不堪而不可阅读。
内码表的扩展正是基于所有这些原因,但是还不够。最低的 128 个代码总是相同的,较高的 128 个代码取决于定义内码表的语言。其他内码表被其他语言定义,每个环境下的内码表都是对该环境所作的标准字符集修正。
字符内码 (character code)
字符内码 (character code) 指的是用来代表字符的内码。在输入和存储文档时都要使用内码,内码分为单字节内码和双字节内码。
单字节内码 – Single-Byte character sets (SBCS), 可以支持 256 个字符编码。
双字节内码 – Double-Byte character sets) (DBCS), 可以支持 65000 个字符编码,主要用来对大字符集的东方文字进行编码。
Code Page
Code Page 是一个经过挑选的以特定顺序排列的字符内码列表(内码表)。
对于早期的单字节内码的语种,Code Page 中的内码顺序使得系统可以按照此列表来根据键盘的输入值给出一个对应的内码。
对于双字节内码,则给出的是 MultiByte 到 Unicode 的对应表,这样就可以把以 Unicode 形式存放的字符转化为相应的字符内码。
在 1980 年前,仍然没有任何国际标准如 ISO-8859 或 Unicode 来定义如何扩展 US-ASCII 编码以便非英语国家的用户使用。很多 IT 厂商发明了他们自己的编码,并且使用了难以记忆的数目来标识。
1.1 CJK
同 Extended Unix Coding ( EUC ) 编码大不一样的是,下面所有的远东 Code Page 都利用了 C1 控制码(=80…=9F)做为首字节,使用 ASCII 值(=40…=7E)做为第二字节,这样才能包含多达数万个双字节字符,这表明在这种编码之中小于 3F 的 ASCII 值不一定代表 ASCII 字符。
C1 控制码范围(=80…=9F):用作远东编码中的首字节,不同于传统的 ASCII 字符。
ASCII 值范围(=40…=7E):被用作远东编码的第二字节。
小于 3F 的 ASCII 值指的是 ASCII 编码中十进制数值小于63(十六进制表示为 3F )的字符。
该设计使得这些编码能够支持更多字符,包括汉字等双字节字符,以确保能够在远东地区的编码系统中有效地表示和处理大量的字符集,远远超出了传统 ASCII 字符集的限制。
CP932
Shift-JIS 包含日本语 charset JIS X 0201 (每个字符一个字节) 和 JIS X 0208 (每个字符两个字节),所以 JIS X 0201 平假名包含一个字节半宽的字符,其剩馀的 60 个字节被用做 7076 个汉字以及 648 个其他全宽字符的首字节。同 EUC-JP 编码区别的是,Shift-JIS 没有包含 JIS X 202 中定义的 5802 个汉字。
Shift_JIS 是一个日本电脑系统常用的编码表。在微软及 IBM 的日语电脑系统中,使用了该编码表,称为 CP932。
它能容纳全角及半角拉丁字母、平假名、片假名、符号及日语汉字。
它被命名为 Shift_JIS 的原因,是它在放置全角字符时,要避开原本在 0xA1-0xDF 放置的半角假名字符。
CP936
GBK 扩展了 EUC-CN 编码 ( GB 2312-80 编码,包含 6763 个汉字) 到 Unicode (GB13000.1-93) 中定义的 20902 个汉字,中国大陆使用的是简体中文 zh_CN。
EUC-CN 是 GB2312 最常用的表示方法。浏览器编码表上的 “GB2312”,通常都是指 “EUC-CN” 表示法。
GB 2312 字元使用两个字节来表示。
“第一位字节” 使用 0xB0-0xF7
“第二位字节” 使用 0xA1-0xFE
举例来说,“啊” 字是 GB 2312 之中的第一个汉字,它的区位码是 1601。
在 EUC-CN 之中,它把 0xA0+16=0xB0,0xA0+1=0xA1,得出 0xB0A1。
CP949
UnifiedHangul (UHC) 是韩文 EUC-KR 编码 (KS C 5601-1992 编码,包括 2350 韩文音节和 4888 个汉字 a) 的超集,包含 8822 个附加的韩文音节 ( 在 C1 中 )。
EUC-KR 用来储存韩国 KSX1001 字集 (旧称 KSC5601) 的字符。此规格由 KSX2901 (旧称 KS C 5861) 定义。
KS X 1001 字