作者:天一阁图书管理员
最近使用python导数据,从一个latin1的数据库导到另一个latin1的数据库,遇到像“漩偑”这样的字符的时候简直是痛不欲生。怎么导怎么报错,如果忽略转码错误又会出现缺少字符的情况。花了几天时间才完全解决这个问题,至于是怎么解决的需要另写一篇python的文章来解释了。还是先练一下基本功吧......
计算机一开始是只支持ascii码表的。而Latin1在ascii的基础上添加了一些字符,ascii表示的是0-126这个范围。但latin1表示的范围是0x0-0xFF。因此latin1就能表示所有的单字节字符。
计算发展的过程中,有一段时间字符集是没有标准的,不少语言都是自己搞了一套,就像大陆和台湾使用的简繁体一样。那时候在windows上字符是使用DBCS来表示的。DBCS就是双字节字符集,使用双字节来表示字符。
gb2312是1980年定义的规范,可想而知它有多古老了......使用16位来表示字符,收录了6763个汉字,682个字符,在那个时候,它支持的字符是有限的,也不支持繁体,当然也仅用于大陆地区,可能也被新加坡使用。
GBK是微软制定的,1995年用于windows95上,这个也比较古老了......也是16位字符集,收录21003个汉字。扩容了很多了。GBK是向下兼容GB2312的。可以支持简繁体共存。
GB18030是国家规定的标准,时间是2000年,这个算是最新的标准,为了包含少数民族们使用的文字而制定的。GB18030是向下兼容GBK的。32位字符集,收录了27553个汉字。同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字。 而到了这个时候,windows内核统一使用unicode了,不再是以前那种DBCS表示方式了。
因为各个国家或者说民族都自己定义自己的字符集,给操作系统厂商和软件商还有用户带来了很大的困扰。字符集的标准化也开始了。unicode使用4字节来表示一个字符,也就是'a'这个字符也要使用32位来表示。这样的话它在理论上表示世界上所有的字符,而且不会出现冲突。每个字符都有自己独特的位置。
unicode发布以后,迟迟得不到推广,因为它太占存储和内存了。后来硬盘和内存白菜价了以后,才慢慢被接受。而为了解决unicode占位太大的问题,出现了不同的UCS Transformation Format,就是unicode转换格式。utf-8就是其中一种,utf-8是一种可变长的字符表达方式。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
可见的是,unicode值越大的字符,使用的存储空间就越大。utf-8不是一种字符集,而是一种字符集的转换方式,用来节省空间的。