找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

Linux中国开源社区 观点 查看内容

对于Windows,GB18030是不可用的

2013-04-20 17:46    评论: 3 收藏: 1    

GB18030,想说爱你不容易

之所以会有此感叹,并非觉得GB18030的编码框架有什么不妥,而是对该标准在实际应用中遇到的尴尬情形的一些个人看法。

疑惑一:GB18030到底是一种ANSI编码还是Unicode编码?

这本来是毫无疑问的,作为对GB2312和GBK的扩展,GB18030势必要向下兼容这两个编码标准,而GB2312和GBK都是不折不扣的ANSI编码,那么建立在这两个标准基础之上的GB18020也理所当然的应该是一种多字节的ANSI编码了。

既然是ANSI编码,那么在实际的系统中,它就应该是作为一种本地化的编码字符集出现的。比如在Windows里面,它就应该像GBK、Big5这些ANSI编码那样,有自己的代码页和相应的代码页属性(主要指引导字节和尾随字节的取值范围)。

对于代码页,微软已经给出了答案:Win2k以上的操作系统只要安装了微软的GB18030-2000扩展支持包,就可以支持GB18020-2000编码标准的54936代码页了。我在安装了18030支持包之后,根据微软给出的测试建议,写了个调用API函数IsValidCodePage(54936)的小程序,测试结果是54936代码页可用(未安装18030支持包以前,测试54936代码页不可用)。

但仅仅是某个代码页可用并不表示文本处理程序就可以处理基于该代码页编码的文本了,还必须把这个代码页设为系统的当前代码页才行。可是,18030扩展包不是自带了一个GB18030?Unicode的文本编码转换程序的嘛,这个程序并不需要把系统的当前代码页设为54936就可以工作呀。

其实,关于这一点花点时间想一下也很简单:文本文件的内码转换其实根本不需要操作系统的支持,这种转码工作在计算机文本处理任务中来说算是最简单的了――说得极端一点,只要有转码表,我们甚至可以写一个在DOS下运行的GB18030?Unicode转码程序,如果省去中文界面的话,这个程序连中文系统都不用加载。在现实应用中,文本处理工作远不只转码这一项,就拿日常用得比较多的文本编辑来说吧――假设有一款以ANSI方式来处理文本的字处理软件,如果想要在这个软件中正确显示和编辑GB18030编码的文本的话,首先就应该把系统的当前代码页设为54936才行。这是因为代表GBK的936代码页的属性和代表GB18030的54936代码页的属性有很大的不同,在936代码页下,ANSI程序是无法正确处理GB18030编码的文本的。

那么把系统的当前代码页设为54936不就好了吗?可是事情好像并没有那么简单……

在编程时,通过调用API函数GetACP可以获得系统当前的代码页,可是Win32 API里面并没有对应提供一个类似"SetACP"这样的设置当前代码页的函数。事实上即使是Windows自己,也没有办法直接改变系统当前的代码页, 改变当前代码页的方法是在控制面板中设置区域和语言选项,然后重启才能生效。Windows区域和语言选项里面的"非Unicode程序语言版本"设置对 于普通电脑用户来说就是为那些只能处理特定语言的程序(ANSI文本处理程序)指定一个正确的,默认可以处理的语言种类(比如是中文、日文或韩文);而对 于开发ANSI文本处理程序的程序员来说,其实就是设置系统当前的代码页。比如要设置950代码页的时候,选"中文(台湾)",要设置936代码页的时候,就选"中文(中国)"。

可是让人难以理解的是,在安装了18030支持包以后,"代码页转换表"里面已经显示"54936(GB18030 简体中文)"代码页是可用使用的了。但在"非Unicode程序语言版本"列表里面,却没有相应地提供一个类似"中文(中国GB18030)"这样的选项,也就是说:Windows根本就没有提供给我们把代表GB18030编码标准的54936代码页设为系统当前代码页的选择。

难道微软并不认为GB18030是一种ANSI编码,不需要相应的代码页支持?可是这个结论显然跟微软提供了54936这个代码页是相矛盾的,因为代码页本身就是处理不同本地化语言的一种机制,生来就是为ANSI编码而设的。而且18030支持包里面的ReadMe文档也透露了它附带的转码程序其实是调用了API函数MultiByteToWideChar和WideCharToMultiByte来实现的(否则无法解释这个程序怎么会只有区区25KB之小),这就是说微软确实是把GB18030当作一种多字节的ANSI编码来看待的。可是现在这个编码的代码页却根本不能设置为系统的当前代码页!这恐怕在Windows所支持的所有代码页里面,是唯一的一个吧。

123下一页
查看其它分页:

最新评论

我也要发表评论

微博评论 2013-04-20 18:34 1 回复
根据Unicode来指定国标,那样多简便啊

来自 MAGI一只鱼向南 的新浪微博
tempwall 2013-04-21 20:15 1 回复

且不说文章时效性问题,这篇文章标题党的意味很重。Windows对18030支持如何,稍微了解一下就能知道。也不清楚这种文章究竟是如何流传的,竟然还可以加精?

"可是让人难以理解的是,在安装了18030支持包以后,"代码页转换表"里面已经显示"54936(GB18030 简体中文)"代码页是可用使用的了。但在"非Unicode程序语言版本"列表里面,却没有相应地提供一个类似"中文(中国GB18030)"这样的选项,也就是说:Windows根本就没有提供给我们把代表GB18030编码标准的54936代码页设为系统当前代码页的选择。"

这种信口开河都能堂而皇之地跑出来,才是真正的难以理解和笑话……

博派大黄蜂 2013-04-21 22:31 1 回复
我只过惠普的BIOS是繁体中文的

收藏

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。