漫话:为什么生僻字计算机上打不出来,或者打出来也无法显示呢?
我们在《漫话:如何给女朋友解释为什么计算机只认识0和1?》中介绍过,在计算机世界中,只有0和1两个字符,所有的数据都需要通过二进制表示,如52个英文字母(大写+小写)、阿拉伯数字以及常用的符号等在计算机都需要通过二进制来表示。
所以,我们在电脑上看到的所有字符,都需要通过一种方式将他们装换成二进制表示。
那么转换的这个过程就需要通过字符编码做映射,我们在《漫话:如何给女朋友解释什么是"锟斤拷"?》中介绍过,为了将字符转换成二进制,有很多字符编码的标准被制定出来,其中包括Unicode、GBK等。
那么,有了字符编码之后,计算机就可以认识我们想输入的字符了,但是想要把他展示出来还是比较复杂的,大致流程如下:
当我们在键盘上输入一个字符之后,计算机会通过Unicode,将这个字符转换成二进制。
接下来,通过获得到的Unicode编码值,查询字体文件中的Charmap,把编码值转换成字形索引。
一旦你获得了字形索引,你便可以装载对应的字形图像。
之后,就可以对这个字形图像进行图形渲染,然后就可以显示在显示器上面了。
大家或许对字形索引、图形渲染这些不是很了解,没关系,大家只需要知道,一个字符想要在电脑上显示出来,需要以下三个条件:
1、输入法支持输入这个字符
2、Unicode编码支持将这个字符转成二进制
3、计算机上安装的字体中包含这个字符
输入法支持字符集由于汉字数以万计,电脑键盘不可能为每一个汉字而造一个按键。因此,人们需要替汉字编一套输入码(检索出汉字的代码),用数个键来输入一个汉字。而把多个按键输入转换成汉字的工具就是中文输入法。
而目前市面上比较常见的中文输入法,大多数都是采用的GBK的作为字符集的。
GBK共收录21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。但是中文汉字远不止2万多,所以,很多生僻字是无法通过输入法打出来的,如"Biángbiáng面"中的biáng字。
另外,还有些输入法使用了比较全的字符集(Unicode等),如郑码、仓颉等输入法是可以输入一些生僻字的。
Unicode字符能够在电脑上显示,还有一个前提就是他可以被翻译成二进制,也就是说,如果一个字符没有被Unicode收录的话,是无论如何都无法显示的。
所以,目前很多汉字的生僻字,还有一些emoji都是无法打出来的。
但是Unicode还是在不断更新的,最近一次更新是2020年3月10日,刚刚发布了Unicode 13.0,Unicode 13.0共增加了5,930个字符,目前共有143,859个字符。
在Unicode 13.0的CJK 统一表意汉字的扩展G区中,已经收录了"Biángbiáng面"中的biáng字,可以看到,其对应代码为30EDD何30EDE。
中日韩统一表意文字(CJK Unified Ideographs),CJK 是中文(Chinese)、日文(Japanese)、韩文(Korean)三国文字的缩写,目的是要把分别来自中文、日文、韩文、越文、壮文中,本质、意义相同、形状一样或稍异的表意文字于ISO 10646及Unicode标准内赋予相同编码。
但是虽然Unicode 13.0已经推出了,但是因为文字编码是要内嵌到操作系统中的,所以还需要操作系统底层也做更新才能兼容。
字体如果Unicode中已经包含了某个生僻字,那么在展示的时候,就会通过得到的Unicode编码值,查询字体文件中的Charmap,把编码值转换成字形索引。
但是,如果预装字体中不包含某些字符的话,也是无法展示的。
也就是说,如果输入法可以兼容最新版的Unicode 13.0,并且操作系统也升级到了最新版的Unicode编码,也不意味着直接就可以显示像"biáng"这样被最新收录的生僻字。
因为这还依赖于操作系统中的字体是否包含这个字符。目前市面上有些商业字体是可以支持CJK中的很多扩展字符的。
相信随着操作系统和输入法更新到新版本的Unicode字符集之后,会有部分字体开始支持新的字符的。
生僻字带来的不便目前有很多家长愿意给孩子起名的时候使用一些生僻字,尤其是一些有美好寓意的生僻字更是经常被使用,如寓意美好的頔。
据新闻报道,某大学生的名字中就曾经使用过"由页"这个字,但是这个字的繁体字“頔”可以打出来,但是简笔用拼音、五笔输入法都打不出。
奇怪的是,当初在公安系统登记名字的时候,却登记成功了,但是在日后的生活中,这位大学遇到了很多阻碍,如支付宝无法实名认证、无法实名制购票、甚至无法报考高考等问题。
后来公安系统的工作人员表示:公安人口信息库专用字库是最全的,甚至包括了不少少数民族的文字,设有生僻字库。但教育部门、银行、航空公司、房产等部门,却没有同步使用这套字库,无法共享很多生僻字,就会出现一系列问题。
有些时候,在一个体系内可以打出来或者显示的生僻字,在另外的体系内就有可能无法显示。所以,对于生僻字的使用,还是要慎重!
关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。
推荐阅读:
喜欢我可以给我设为星标哦
好文章,我 在看