php gb18030 utf-8,Unicode UTF-8与GB18030编码解析(golang)

最早接触到编码问题时,无非是关于『乱码』一词,当某个程序或者网页或者数据库或者IDE中一看出现了乱码,就马上知道这是字符编码与解码不匹配,改下编码就好,就因为这个事情太简单,容易解决,甚至在一段时间看到一段乱码文字形状,就知道这肯定是xxx编码转为yyy编码存储然后又用xxx来显示导致的。。。

从来没有去纠结到底为什么有这么多编码,到底为何需要转换?是怎么转换的?如何转换?为什么都通用utf-8还有很多新项目在用GBK呢?

折腾了1个晚上,我明白了。。。以下我都用我自己理解的语言来描述下,分享下

ASCII编码

美国人发明计算机,美国人用八位表示1字节,8位的数据可以有28 =256 种状态描述事物。首先他添加进去了26个字母包括大小写,然后标点符号,换行符...然后用掉了128个,把这种做法取了个很吊名字叫『Ascii』,是『美国信息互换标准代码』的缩写。这也是我们小时候学习计算机的Ascii码表,当时貌似在C语言课本附录里面。

打印一个字符的Ascii码很简单

fmt.Printf("%d", 'A')

GB系列编码

很明显,这个American Standard 从未考虑中国人的感受,你可以显示字母就完事了,中国的国粹汉字咋整?所以在中国的一群人开始做自己的编码,那是在1980年,做出来的是GB 2312-80也就是GB2312,实现原理是用两个字节表示汉字,127以下的还是按照ASCII标准,因为有了2个字节,理论上可以有216 -128 = 65535-128种表示汉字的方式。

最早接触GB 2312一词也是在大学的时候,做网站,如果meta头里面不加上charset=gb2312那网页显示就是乱码,因为早期的浏览器默认编码是ISO-xxx,如果不在页面强制标示为gb2312,那么就会被使用ISO的方式来解析gb2312编码后的中文,肯定会出现一堆不知道什么语言的文字。

通俗来讲,GB 2312规定的一个汉字用16个二进制的0或者1来存储,像一部几千字的新华字典,按照编号一个个的编了进去。

GB2312编码范围:A1A1(101010001 10100001)到FEFE,A1A1-B0A1之间的是特殊符号,还记得小时候有个输入法叫『智能ABC』么?输入法里面的v1-v9就会出来特殊符号(玩WOW的时候经常用来给昵称加特殊字符)正好就是GB2312编码表最前面的特殊字符部分。。

php gb18030 utf-8,Unicode UTF-8与GB18030编码解析(golang)_第1张图片

汉字的编码范围为B0A1-F7FE

B0A1是『啊』,B0A2是『阿』。。。。真的是按照新华字典方式,D7F9是『座』标准汉字的最后一个,D7F9-F7FE是那一堆不太常用,或者都没人认识的汉字。

突然想到了『汉卡』一词,不知道还有没有人记得这个东西,80年代到90年代初的计算机不支持中文,中国当年的很多计算机人才研制出来『汉卡』的硬件,插入到IBM的电脑上之后,就可以进行文字输入与显示,汉卡就是采用GB2312编码将汉字显示出来的硬件处理工具。在那个时期的所有计算机,都是要插入汉卡才能显示与输入汉字。联想Lenovo叫『联想』,就是因为柳传志的Team做了最早有联想功能的汉卡。

GB后来又有了新的发展,都是以GB2312为基础进行扩展,GBK是扩展升级版,GB18030是再扩展升级,支持的图形与文字越来越多。值得一说的是,GB2312与GBK对任意一个图形字符都采用两个字节表示。因为GB18030增加了繁体字、日韩、以及少数民族文字,超出了216 个,也是吸取了UTF-8的处理方式,是由1个、2个或4个字节组成。GB18030的设计初衷我猜测也是因为一个文件只能采用1中编码方式,如果中文中混合了日文、韩文等文字,那么就非常麻烦了,所以GB18030把中国的文章中可能出现的周边的最常用的语言文字都加入在内。

总结下GB编码:

1.

你可能感兴趣的:(php,gb18030,utf-8)