代码页CodePage
代码页Code Page
微软为了适应世界上不同地区⽤户的⽂化背景和⽣活习惯,在Windows中设计了区域(Locale)设置的功能。Local是指特定于某个国家或地区的⼀组设定,包括代码页,数字、货币、时间和⽇期的格式等。在Windows内部,其实有两个Locale设置:系统Locale和⽤户Locale。系统Locale决定代码页,⽤户Locale决定数字、货币、时间和⽇期的格式。我们可以在控制⾯板的“区域和语⾔选项”中设置系统Locale和⽤户Locale:每个Locale都有⼀个对应的代码页。Locale和代码页的对应关系,⼤家可以参阅我的另⼀篇⽂章《谈谈Windows程序中的字符编码》的附录1。系统Locale对应的代码页被作为Windows的默认代码页。在没有⽂本编码信息时,Windows按照默认代码页的编码⽅案解释⽂本数据。这个默认代码页通常被称作ANSI代码页(ACP)。 ANSI代码页还有⼀层意思,就是微软⾃⼰定义的代码页。在历史上,IBM的个⼈计算机和微软公司的操作系统曾经是PC的标准配置。微软公司将IBM公司定义的代码页称作OEM代码页,在IBM公司的代码页基础上作了些增补后,作为⾃⼰的代码页,并冠以ANSI的字样。我们在“区域和语⾔选项”⾼级页⾯的代码页转换表中看到的包含ANSI字样的代码页都是微软⾃⼰定义的代码页。例如: 874 (ANSI/OEM - 泰⽂) 932 (ANSI/OEM - ⽇⽂ Shift-JIS) 936 (ANSI/OEM - 简体中⽂ GBK) 949 (ANSI/OEM - 韩
⽂) 950 (ANSI/OEM - 繁体中⽂ Big5) 1250 (ANSI - 中欧) 1251 (ANSI - 西⾥尔⽂) 1252 (ANSI -拉丁⽂ I) 1253 (ANSI - 希腊⽂) 1254 (ANSI - ⼟⽿其⽂) 1255 (ANSI - 希伯来⽂) 1256 (ANSI - 阿拉伯⽂) 1257 (ANSI - 波罗的海⽂) 1258 (ANSI/OEM - 越南)在UniToy中,我们可以按照代码页编码顺序查看这些代码页的字符和编码:我们不能直接设置ANSI代码页,只能通过选择系统Locale,间接改变当前的ANSI代码页。微软定义的Locale只使⽤⾃⼰定义的代码页。所以,我们虽然可以通过“区域和语⾔选
项”中的代码页转换表安装很多代码页,但只能将微软的代码页作为系统默认代码页。在Windows 2000以后,Windows统⼀采⽤UTF-16作为内部字符编码。现在,安装⼀个代码页就是安装⼀张代码页转换表。通过代码页转换表,Windows既可以将代码页的编码转换到UTF-16,也可以将UTF-16转换到代码页的编码。代码页转换表的具体实现可以是⼀个以nls为后缀的数据⽂件,也可以是⼀个提供转换函数的动态链接库。有的代码页是不需要安装的。例如:Windows将UTF-7和UTF-8分别作为代码页65000和代码页65001。UTF-7、UTF-8和UTF-16都是基于Unicode的编码⽅案。它们之间可以通过简单的算法直接转换,不需要安装代码页转换表。在安装过⼀个代码页后,Windows就知道怎样将该代码页的⽂本转换到Unicode⽂本,也知道怎样将Unicode⽂本转换成该代码页的⽂本。例如:UniToy有导⼊和导出功能。所谓导⼊功能就是将任⼀代码页的⽂本⽂件转换到Unicode⽂本;导出功能就是将Unicode⽂本转换到任⼀指定的代码页。这⾥所说的代码页就是指系统已安装的代码页:其实,如果全世界⼈民在计算机
刚发明时就统⼀采⽤Unicode作为字符编码,那么代码页就没有存在的必要了。可惜在Unicode被发明前,世界各国⼈民都发明并使⽤了各种字符编码⽅案。所以,Windows必须通过代码页⽀持已经被⼴泛使⽤的字符编码。从这种意义看,代码页主要是为了兼容现有的数据、程序和习惯⽽存在的。2.2 代码页实例2.2.1 实例⼀:GB18030代码页1.1节的“错误2”中演⽰了⼀个全被显⽰成'?'的⽂件。这个⽂件的数据是:其实,这是⼀个包含了6个四字节字符的GB18030编码的⽂件。记事本按照GBK显⽰这些数据,⽽GB18030的四字节字符编码在GBK中是未定义的。Windows根据⾸字节范围判断出12个双字节字符,然后因为不到匹配的转换⽽将其映射到默认字符'?'。使⽤UniToy按照GB18030代码页导⼊这个⽂件,就可以看到:这个GB18030编码的⽂件是⽤UniToy创建的,编辑Unicode⽂本,然后导出到GB18030编码格式。 2.2.2 实例⼆:GBK和Big5的转换综合使⽤UniToy的导⼊、导出功能就可以在任意两个代码页之间转换⽂本。其实,由于各代码页⽀持的字符范围不同,我们⼀般不会直接在代码页间转换⽂本。例如将以下GBK编码的⽂本:直接转换到Big5编码,就会看到:变成'?'的字符都是Big5编码不⽀持的简化字。在从Unicode转换到Big5编码时,由于Big5编码不⽀持这些字符,Windows就⽤默认字
符'?'代替。在UniToy中,我们可以先将简体字转换到繁体字,然后再导出到Big5编码,就可以正常显⽰:同理,将Big5编码的⽂本转换到GBK编码的步骤应该是:将Big5编码的⽂本导⼊到Unicode⽂本;将繁体的Unicode⽂本转换简体的Unicode⽂本;将简体的Unicode⽂本导出到GBK⽂本。
分享到搜狐微博
数字转unicode编码体验新版博客

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。