python乱码转码_Python解决乱码问题
解决python乱码问题
字符串在python的内部采⽤unicode的编码⽅式,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另⼀种编码。 编码是⼀种⽤⼆进制数据表⽰抽象字符的⽅式,utf8是⼀种编码⽅式。
代码中的字符串编码默认和代码⽂件编码相同。
decode的作⽤是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表⽰将gb2312编码的字符串str1转换成unicode编码。
encode的作⽤是将unicode编码转换成其他编码的字符串,如de('gb2312'),表⽰将unicode编码的字符串str2转换成
gb2312编码。
因此,转码的时候⼀定要先搞明⽩,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
python2中的unicode和python3中的str等价。可以查看s.__class__,如果为则为unicode编码及⽂本数据,如果为则为utf8编码及⼆进制数据。str(s, 'utf8')和s.decode('utf8')等价。
如果字符串在代码中被定义为s=u'中⽂',则s就是python内部编码unicode。
unicode类型再解码会报错。
判断⼀个字符串是否为unicode⽅法isinstance(s, unicode),python2中的unicode和python3中的str等价,所以在python3中判断⼀个字符串是否为unicode⽅法为isinstance(s, str)。
获取系统默认编码:
defaultencoding())
有些IDE输出乱码是因为控制台不能输出字符串的编码,这倒不是程序本⾝的问题。⽐如windows的控制台是gb2312编码⽅式,则utf8的输出格式不能正确输出。
⼀种输出格式为gb2312避免乱码的⽅式(如果不确定是哪种编码格式,可以使⽤⼀下的通⽤形式去处理):
#coding=utf-8
s='中⽂'
if(isinstance(s, str)):#s为u'中⽂'
s.decode('utf8').encode('gb2312')
采⽤标准库codecs模块
codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=1)importcodecs
unicode编码转换二进制
f= codecs.open(filename, encoding='utf-8')
使⽤上边这种⽅式读进来utf-8⽂件,会⾃动转换为unicode。但必须明确该⽂件类型为utf8类型。
如果是⽂件中有汉字,不是⼀个字节⼀个字节地读⽽是整个汉字的所有字节读进来然后转换成unicode(猜想跟汉字的utf8编码有关)。
下边的代码也是⼀种使⽤codecs的读写⽅式
#coding=utf-8
importcodecs
fin= open("", 'r')
fout= open("", 'w')
reader= ader('gbk')(fin)
writer= writer('gbk')(fout)
data= ad(10)#10是最⼤字节数,默认值为-1表⽰尽可能⼤。可以避免⼀次处理⼤量数据whiledata:
writer.write(data)
data= ad(10)