python中字符编码及unicode和utf-8区别
ascii和unicode是字符集,utf-8是编码集
- 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
- 编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
ascii每个字符占用一个字节(8位),其中第一位恒为0,因此ascii一共可以表示128个字符
unicode每个字符占用两个字节(16位),可以用来表示汉字
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关于UTF-8
UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节:
unicode和ascii都是一种对字符的编码方式,规定了字符的二进制表示,却没规定这个二进制代码如何存储。
所以在一个系统中,如何正确的区分unicode和ascii编码呢?于是就有了utf-8,utf-8主要就是对【字符的二进制代码】进行编码
utf-8如何编码
对于单字节,utf-8就使用一个字节编码,第一位为0,剩下七位为【字符的二进制代码】,这和ascii是一样的。
对于多字节来说,假设是N字节,那么对于第一个字节来说前N位都是1,第N+1位是0,第二个字节前两位是10,第三个及后面的字节前两位也都是10,余下的位就用【字符的二进制代码】补充。
这就是对utf-8对unicode即【字符的二进制代码】的一种编码方式。
utf-8如何解码
如何第一位是0,表示是这个字节就是一个字符,如果第一位是1,统计一下一共多少个1,1的个数就表示字符的字节数
python中的字符编码问题
在python中默认的字符编码方式是ansii,所以当输入中文时会报错,这是需要在第一行加上#encoding=utf-8,就可以将中文用utf-8来进行编码了,对于英文来说它的编码方式还是ansii,
对于unicode来说,他就直接采用unicode编码方式
#encoding=utf-8 import chardet //查看字符串编码方式 a = '哈哈' b = 'abc' c = u'你好' print len(a) //utf-8,一个字符三位 print len(b) print len(c) //unicode为什么是两位 print chardet.detect(a) print chardet.detect(b) print type(a) print type(b) print type(c) ------output--------- 6 3 2 {'confidence': 0.7525, 'language': '', 'encoding': 'utf-8'} {'confidence': 1.0, 'language': '', 'encoding': 'ascii'} <type 'str'> <type 'str'> <type 'unicode'>
str和unicode转化
str是对【字符二进制代码】编码后的内容,它可以采用ansii,utf-8进行编码
unicode -> str 通过 encode('')方法,默认是ansii
str -> unicode 通过decode('')
d = a.decode('utf-8') //a为上文 print type(d) ------output------- <type 'unicode'>
参考博客:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html