对于编码问题,一直以来都是懵懵懂懂的,没有一个明确的概念.今天特意了解了下这方面的内容.并尝试将自己的理解写出来.表述不会很严谨,如有错误还请指正.
推荐两篇文章:
http://www.crifan.com/switch_character_encoding_notes_ascii_unicode_and_utf-8/
http://www.crifan.com/files/doc/docbook/char_encoding/release/html/char_encoding.html
了解两个概念
字符集
字符集是各种文字和符号的总称.比如所有的简体中文可以归结为一套字符,所有的英文字母可以归结为一套字符.你也可以把你看到的所有的符号文字数字归结为一套字符.
字符编码
字符编码就是把以上的字符按照一定的规则编成计算机能理解的语言.将计算机中的数值转化为对应的字符,显示出来.所以它做这些事情:一个字符用几个字节来表示,这些字节使用怎样的规则来排布.
所以我们说的ASCII,Unicode等都是编码规则,是人为制定的.
你也可以自己编一套规则,但只有你自己一个人用.意义不大.
有了以上两个概念,我们就可以来看下编码的来龙去脉了
编码的发展
计算机刚开始出现时,没有统一的编码规则.各个厂家或公司都有自己的做法.可以想象下这种场景:你跑了大老远的路,带了份数据过来,结果由于计算机的编码不一样导致在我的计算机上不能使用.你白跑了.
所以后来大家就统一了编码,都使用ASCII.
但在考虑编码的时候,只考虑了英文字母及数字符号等,随着计算机的发展,ASCII的问题就出来了:不同的国家有不同的字母,如我们的中文汉字,就无法用ASCII码表示.
这个时候大家就想,如果有一套规则可以把世界上所有的字符都囊括进来,不就可以统一使用了吗.于是Unicode就诞生了.
Unicode是一个很大的集合,现在的规模可以容纳100多万个符号.每个符号的编码都不一样,既有中文也有英文,还有阿拉伯文,韩文等.但需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储.
这个时候,UTF8就出来了.它实现了Unicode的使用,并且是当前使用最广的一种Unicode的实现方式.
以上就是ASCII,Unicode,UTF-8的来龙去脉了.
对于它们具体的实现细节,可以在上面的文章中看到,这里就不在赘述了.
2个小TIPS:
UTF8是Unicode的实现方式
utf8要转到GBK时,需先转成Unicode,再转成GBK
python下使用
以下的例子适用于python2
查看当前使用的编码
sys.stdin.encoding
判断某个字符是什么编码
chardet.detect()
在python中,decode是解码,encode是编码.在转换时,可以先解码,再编码.
例
In [43]: sys.stdin.encoding
Out[43]: 'UTF-8'
In [44]: a = '合'
In [45]: a
Out[45]: '\xe5\x90\x88'
In [46]: b = a.decode('utf8')
In [47]: b
Out[47]: u'\u5408'
In [48]: c = b.encode('gbk')
In [49]: c
Out[49]: '\xba\xcf'
In [50]: chardet.detect(c)
Out[50]: {'confidence': 0.99, 'encoding': 'GB2312'}