代码页

维基百科,自由的百科全书
跳转至: 导航搜索

代码页字符编码的别名,也稱「內碼表」,是特定语言的字符集的一张表。早期,代码页是IBM称呼计算机的BIOS所支持的字符集编码。当时通用的操作系统都是命令行界面,这些操作系统直接使用BIOS提供的字符绘制功能来显示字符。这些BIOS代码页也被称为OEM代码页图形操作系统使用自己的字符呈现引擎(rendering engine),可以支持多个不同的字符集编码,这类代码页被称作ANSI代码页

早期IBM微软内部使用数字来标记不同的编码字符集,不同的厂商对同一个字符集编码使用各自不同的名称。例如,UTF-8在IBM称作代码页1208,在微软称作代码页65001,在SAP称作代码页4110.

1987年4月,IBM发布了PC-DOS 3.3,正式开始使用16比特的无符号整数标识不同的代码页。这时的PC机使用CGA显示系统的字符界面,绘制不同语言的字符依靠BIOS硬件厂商提供的功能。如果想更换所支持的字符集,就必须换上支持该字符集的ROM芯片。微软作为DOS操作系统的软件厂商,并不拥有绘制这些字符集的知识产权。所以这些字符集的绘制实现,称作OEM代码页。最常见、最具代表性的OEM代码页是"IBM PC或MS-DOS 代码页437"。

代码页437

随着图形用户界面操作系统的广泛使用(最初被广为接受的是Windows 3.1),操作系统具有了字符绘制的功能。微软在Windows操作系统没有转向UTF-16作为内码实现之前(也就是在Windows 2000之前),针对不同的使用地区与国家,定义了一系列的支持不同语言字符集的代码页,被称作"Windows(或ANSI)代码页"。代表性的是实现了ISO-8859-1的代码页1252.

OEM(IBM PC)代碼頁[编辑]

代码页819实现了Latin-1(ISO/IEC 8859-1),用于IBM AS/400小型机。

OEM代码页转换为ASCII代码页[编辑]

对于中日韩的多字节编码的代码页,OEM代码页与ASCII代码页相同,例如对于简体中文的OEM代码页与ASCII代码页就是GBK代码页。而对于单字节编码的代码页,如英语、俄语等,OEM代码页与ASCII代码页一般不同。这是因为在MS-DOS时代,计算机只能使用字符界面在屏幕上画出表格的框线,所以OEM代码页要在单字节字符集中包含方框绘制字符;而在Windows的早期时代,仍然使用单字节字符集,这时就舍弃了这些方框绘制字符。为此,一个用OEM代码页的字节流要在Windows上正确显示,就需要或者显式设定使用OEM代码页;或者要显式把OEM代码页的字节流转化为ASCII代码页的字符流,这需要使用Windows系统调用OemToChar()

中日韩语言代码页[编辑]

既是OEM代码页,也是Windows代码页。

其他代碼頁[编辑]

Windows(ANSI)代碼頁[编辑]

Windows-1252与ISO-8859-1并不完全一致。ISO-8859-1在0x80-0x9F范围的控制字符,在Windows-1252中被可打印字符取代。由于在web网页中,ASCII控制字符不起作用,所以网页一般用Windows-1252代码页标记替代ISO-8859-1标记。

改变代码页[编辑]

对于Windows操作系统中的命令行窗口(Command Prompt),chcp命令在没有参数时,显示当前代码页;chcp命令带一个整数参数,则改变命令行窗口的当前代码页为参数所指定。

查询代码页的信息[编辑]

Windows系统调用GetCPInfo()给出指定的代码页的信息。如东亚多字节代码页的缺省字符、前导字节的范围:

{
 CPINFO info;
 UINT iCP = 932; //GBK  
 GetCPInfo(iCP, &info);
 printf("Code page %d's default char is [%c]\n", iCP, info.DefaultChar[0]);
 printf("Max size of a char: %d\n", info.MaxCharSize);
 int i;
 const int iMaxLeadBytePairNum = 5;
 for (i = 0; i < iMaxLeadBytePairNum; i++)
 {
    if (info.LeadByte[i * 2] == 0 && info.LeadByte[i * 2 + 1] == 0)
        break;
    printf("Lead byte pair %d: 0x%02X-0x%02X\n", i, info.LeadByte[i * 2], info.LeadByte[i * 2 + 1]);
 }
}

外部連結[编辑]