代码页

✍ dations ◷ 2025-02-28 10:09:01 #Pages using deprecated source tags,字符编码

代码页是字符编码的别名,也称内码表,是特定语言的字符集的一张表。

早期,代码页是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硬件厂商(在当时就是指制定业界标准的IBM)提供的功能。如果想更换所支持的字符集,就必须换上支持该字符集的ROM芯片。微软作为DOS操作系统的软件厂商,并不拥有绘制这些字符集的知识产权。所以这些字符集的绘制实现,称作OEM代码页。最常见、最具代表性的OEM代码页是"IBM PC或MS-DOS 代码页437"。

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

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

对于中日韩的多字节编码的代码页,OEM代码页与ASCII代码页相同,例如对于简体中文的OEM代码页与ASCII代码页就是GBK代码页。而对于单字节编码的代码页,如英语、俄语等,OEM代码页与ASCII代码页一般不同。这是因为在MS-DOS时代,计算机只能使用字符界面在屏幕上画出表格的框线,所以OEM代码页要在单字节字符集中包含方框绘制字符;此外,OEM代码页437提供的有限的变音符号,只能覆盖法语、西班牙语、德语、意大利语、瑞典语的字母表。而在Windows的早期时代,仍然使用单字节字符集,这时就舍弃了这些不必要的方框绘制字符,取而代之的是丹麦语、挪威语、冰岛语、加拿大法语的变音符号。为此,一个用OEM代码页的字节流要在Windows上正确显示,就需要或者显式设定使用OEM代码页;或者要显式把OEM代码页的字节流转化为ASCII代码页的字符流,这需要使用Windows系统调用OemToChar()

Windows代码页最初是根据ANSI草案实现的,这个草案最终成为ISO 8859-1。这是Windows代码页被称作ANSI的缘由。

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

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

Windows平台上的GUI程序使用ANSI代码页,而在控制台程序使用OEM代码页(以便向后兼容)。这意味着,如果在记事本程序(notepad.exe)打开一个8位字符集编码的文本文件,将使用ANSI代码页;如果在命令行中用type命令显示这个文本文件的内容,将使用OEM代码页。这两个代码页在前128个字符的编码是一样的,但后128个字符的编码可能不一致。在Windows的命令行窗口通过标记、复制操作把一部分文本内容复制到记事本程序中,实际上是把Unicode格式的内容保存在剪贴板,使得这种文本复制保持了字符编码的透明转换。

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

把UTF-8编码文本直接写到控制台,必须先使用函数SetConsoleOutputCP(65001),然后使用puts一族的函数来输出文本。把UTF-8编码文本写入UTF-8文件时,可以直接使用窄字符输出函数。

在Windows API中,CP_ACP与CP_OEMCP分别表示当前系统的ANSI代码页与OEM代码页。对于CJK(多字节编码)的环境(泰文,日文,韩文,中文),CP_ACP与CP_OEMCP没有区别。对于非 CJK(单字节编码)的环境这两个代码页不同。 Windows的文件操作的API默认使用ASCII代码页(即CP_ACP),设备的操作的函数使用OEM代码页(即CP_OEMCP)。读写console的函数是对console设备的操作,所以默认使用OEMCP。

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

相关

  • CD79CD79是一种跨膜蛋白,可与B细胞受体(BCR)结合为复合体,并在BCR识别抗原后产生一个信号。 CD79由两个不同的肽链组成,分别称为CD79A 和 CD79B(之前称为Ig-alpha和Ig-beta),这两个肽链
  • 心肌层心肌是由心肌细胞构成的一种肌肉组织。心肌细胞分布不单在心壁上,临心大血管上也有心肌的分布。心肌也是横纹肌。相比起骨骼肌细胞,心肌细胞有其自身的特点:
  • 蒲公英咖啡蒲公英咖啡(英语:Dandelion coffee)是一种由蒲公英的根加工后获得的饮料。它拥有类似咖啡的气味和口感,但不含咖啡因。由于不含咖啡因,所以很适合想要喝咖啡却不能摄取咖啡因的人
  • 德班市德班(英语:Durban,南非语:Durban)是南非夸祖鲁-纳塔尔省最大的一座城市,祖鲁语称之为“eThekwini(特克维尼)”,“itheku”在祖鲁语中意为“海港或潟湖”,而“eThekwini”的叫法即是由
  • 氨基甲酸胺甲酸(NH2COOH)也称为氨基甲酸,是最简单的胺基甲酸酯,化学式是NH2COOH。看做是甲酸上的一个氢被胺基取代,这使得它同时是羧酸也是种酰胺。有许多胺甲酸的衍生物,多半都是不稳定的
  • 达瓦齐准噶尔汗国浑台吉(1752年-1755年)居京师之绰罗斯和硕亲王(1755年-1759年)绰罗斯和硕亲王达瓦齐(蒙古语:.mw-parser-output .font-mong{font-family:"Menk Hawang Tig","Menk Qagan T
  • 横县横县(邮政式拼音:Henghsien)在中国广西壮族自治区东南部,郁江横贯,具有2100多年历史。横县地处北回归线以南,属南亚热带季风气候。地处东经108°48’~109°37’,北纬22°08’~23°30
  • 隆安省隆安省(越南语:Tỉnh Long An/.mw-parser-output .han-nom{font-family:"Nom Na Tong","Han-Nom Gothic","Han-Nom Ming","HAN NOM A","HAN NOM B","Ming-Lt-HKSCS-UNI-H","Min
  • 澳大利亚广播公司新闻频道澳大利亚广播公司新闻频道(英语:ABC News),前称澳大利亚广播公司24小时新闻频道(英语:ABC News 24),是由澳大利亚广播公司运营所有的一个24小时新闻频道,于2010年7月22日开始播出。20
  • 凤凰城天港国际机场菲尼克斯天港国际机场(英语:Phoenix Sky Harbor International Airport,IATA代码:PHX;ICAO代码:KPHX;FAA代码:PHX)是一座军民两用机场,位于美国亚利桑那州菲尼克斯东南4.8千米的马里科