Python 中的编码问题,主要是涉及到中文问题
在sublime编辑器中,编码问题涉及到源文件的编码和代码中的编码问题。
sublime编辑器,源文件默认是ascii编码,写入中文文字会报编码错误,因此很多源文件中第一行会指定特定源文件的编码类型,例如# -*- coding: utf-8 -*-
python中字符串的编码与解码,主要涉及到两个字符串函数encode 和 decode
python中的str类型都是对应特定编码类型的,比如utf-8、gbk等,比如“中文”在不同的编码类型下str字符串对应的字节码是不同,因为相同的字符,不同的编码规则,对应的字节是不同的。
# -*- coding: utf-8 -*-
# 中文
import sys
s = "中文"
b = s.decode('utf-8')
print type(b)
c = b.encode('utf-8')
d = b.encode('gbk')
print list(bytearray(c))
print list(bytearray(d))
print sys.stdout.encoding
print s
输出:
<type 'unicode'>
[228, 184, 173, 230, 150, 135]
[214, 208, 206, 196]
utf-8
中文
python2.7中字符串str类型是对应特定编码类型的字节码的,为了实现了多种不同编码类型的字符串的转换,python2.7引入了unicode编码类型,作为不同编码类型的字符串的转换的中介。
所以就出现了,特定编码的str类型的对象按照它的编码类型进行decode成unicode类型的对象,然后unicode对象在按照特定编码类型在encode成str对象,实现了不同的编码类型str对象的转换。unicode可以作为中介的原因在于它支持所有字符的编码。
还有就是print字符串的时候出现的编码错误问题。原因在于sys.stdout.encoding。print 后面跟的字符串对象的编码类型一定要与sys.stdout.encoding所指定的一致,不一致就会出现编码错误,原因在于,打印字符的时候,按照默认的编码类型无法解析其他编码类型的字节。例如,在上面的代码中添加print d会出错。因为d的编码类型是gbk。所以这就是为啥涉及到字符串中有中文的时候,使用print打印出现看看的时候出现编码错误的原因。