我知道你不知道GB2312

2020-10-23 11:50:54 浏览数 (1)

磨人的编码

这篇文章将是大猫《如何搞定头疼的编码》一文的一部分,当时本来想做一个完整的有关“R与编码”的笔记,没想到后来洋洋洒洒写了六七千字,估计一时半会也完成不了,所以先选出其中有意思的一节同大家分享。

这次的主角GB2312是一种陈旧的中文编码。说到编码,其实和牙疼差不多:编码是一个常常被忽视的“小问题”——直到他给你造成成吨的伤害。它尤其频繁出现于数据传输中,例如你在澳大利亚的机器上建立的SAS数据集死活没法在中国的SAS中打开,或是R 操作台打印中文总是乱码等等。编码问题在平日的Office工作中也常遇到,例如大猫的硕士论文要求用“仿宋”来写——大猫也按照要求做了,但最后还是被骂——因为对方要求的是“仿宋GB2312”!这是大猫心中各种WTF…… 最哭笑不得的是,当前中国政府间使用最广的字体“仿宋GB2312”其实连朱镕基的“镕”都打不出。为什么一个连自己总理名字都打不出来的编码,竟然会成为政府的公文标准?

文编码:GB2312 / GBK / GB18030

先让我们总结一下中文编码(想了解更多“R与中文编码”锁定大猫下期的公众号文章!)目前,大陆常见的能够编码中文的编码体系有两大类,一类是Unicode类,其中最常见的是UTF-8,他能表示包含中文的所有字符。另一类是ANSI类,最常见的是GB2312/GBK/GB18030三种,他们能很好支持中文,但是面对其它语言可能出现乱码。Windows简体中文系统采用的是ANSI类别下的“GBK”编码,对应的Window名称叫做Codepage-936 (CP-936)。

当然,ANSI类编码也有对应繁体中文的分支,最常见的叫做BIG-5,主要应用在港澳台,对应的Windows名称叫做 Codepage-950 (CP-950)。

GB2312 / GBK / GB18030这三种编码究竟有什么区别呢?

说来简单,他们的主要区别在于发布时间以及收录汉字的数量。1980年,我国出台了最早的简体中文国家编码标准:GB2312,对应Windows名称叫做CP-936。这一标准只收录6763个汉字,很多生僻字都找不到,甚至连“朱镕基”的“镕”都没有收录!当时的微软看到了这一情况,自己扩展了GB2312标准,于1995年推出了GBK标准,其Windows名称仍旧为CP-936。GBK包含了21003个汉字,是GB2312的3倍,成为了日后简体中文Windows的标准编码格式。

但是中文编码让一家美国公司掌握岂不是很没面子?2000年官方的扩展编码终于发布,名字叫做GB18030,收录27484个汉字,Windows名称叫做CP-54936。可以看到,GB18030只是在GBK基础上进行了小幅添加。下表总结了三个编码格式。

现在让我们回到最初提到的那个“仿宋GB2312”的问题,答案一目了然了。首先要明确的是,的确有两种仿宋字体,一种叫做“仿宋GB2312”,另一种叫做“仿宋”。其中“仿宋GB2312”顾名思义,遵循的是GB2312标准,发布时间早,收录的字数也少;而“仿宋”遵循的是微软自己的GBK标准,发布时间晚、收录字数多,是Windows以及Office的默认字体。也就是说,如果你想安装“老古董”“仿宋GB2312”,你还得另外去下载,然鹅——

仿宋GB2312竟然TM是很多政府的公文专用字体!!!

为什么一个连朱镕基的“镕”都打不出来的古董编码竟然是中国政府公文最常用的编码?!!难道——等等,我知道你在开脑洞了。别急,看了下面的图片你就知道了

有没有发现“仿宋GB2312”要比“仿宋GBK”的字体粗一些?这就是原因所在了,微软在推出新一代Windows的时候顺带把老的仿宋GB2312给重新设计了一把,本来是好意想让字体更加纤细优美的,但是这让每天处理成吨文件的公务员炸了锅——你TM知不知道我每天看着那么细的字体有多累?你TM就没考虑过用户感受?!虽然上面这张图看起来两者的差距没有那么大,但是大猫必须承认,当打印到纸上的时候,仿宋GB2312真的比仿宋要舒服很多……Orz

结果自然是新仿宋没有被政府所接纳——哪怕他打不出来自己总理的名字。当然另外可能还有官僚作风的影响,让一个政府改变自己沿用了那么多年的字体并不是一件轻松的事,无论世界那个国家都是如此,你看看现在那么多政府医院银行还在用着XP系统就知道了。(微软内心OS:这锅我们不背)

总之,GB2312是一个很有趣的历史遗留问题,虽然年代久远,但仍旧会时不时同我们偶遇。下次再遇到类似问题,虽然也许仍旧只能“遵循传统”办事,但至少不会盲目吐槽。而且知道了背后的原因,是不是有些小得意呢?

期预告

这一期大猫只是介绍了有关编码的一个小知识,下一期,大猫将详细讲解编码的基本知识以及如何玩转R的编码体系。(什么?上期说的Microsoft Machine Learning Server的介绍?那个随缘吧……)

0 人点赞