python2中,默认编码是unicode编码,这种编码不能直接存储物理硬件(磁盘的扇区、网络的socket)中,需要转换成string(由连续的字节组成)
>>> s = '你好' >>> s '\xc4\xe3\xba\xc3' >>> s.encode('utf8') Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> s.encode('utf8') UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) >>> s.encode('gbk') Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> s.encode('gbk') UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
从错误提示可以看出,字符串s不是unicode编码是而是ascii编码,不能再进行编码。
创建unicode编码字符串 在字符串前加’u’
>>> s1 = u'你好' >>> s1 u'\u4f60\u597d' #通过结果可以看出这是一个unicode编码字符串因为格式为u’xxxx’
对unicode字符串进行编码(编码格式 分别为utf8和gbk)得到了string字符串(由连续的字节组成)
>>> s1.encode('utf8') '\xe4\xbd\xa0\xe5\xa5\xbd' >>> s1.encode('gbk') '\xc4\xe3\xba\xc3'
在python中只使用内部的unicode表示字符,编解码要使用统一格式 ,否则会乱码
>>> s2 = s1.encode('utf8') >>> s2 '\xe4\xbd\xa0\xe5\xa5\xbd' >>> s2.decode('utf8') u'\u4f60\u597d' >>> print(s2.decode('utf8')) 你好 >>> s2.decode('gbk') u'\u6d63\u72b2\u30bd' >>> print(s2.decode('gbk')) 浣犲ソ
Py2中写入文件时要把unicode编码格式编码,从文件读出后,也要把读出的按统一格式解码。
Py2文件读写:
>>> f = open('py2io.txt','w') >>> s = u'你好' >>> f.write(s.encode('gbk')) >>> f.close() >>> f = open('py2io.txt','r') >>> t = f.read() >>> f.close() >>> t '\xc4\xe3\xba\xc3' >>> t.decode('gbk') u'\u4f60\u597d' >>> print t.decode('gbk') 你好
>>> f = open('py2io.txt','w') >>> s = '你好' >>> f.write(s) >>> f.close() >>> >>> f = open('py2io.txt','r') >>> t = f.read() >>> f.close() >>> t '\xc4\xe3\xba\xc3' >>> print t 你好 >>>
在py3中 py2的str变成了byte,unicode变成了str(真正意义上的连续字符串),在py3 表示byte需要在字符串前加个b
在py2中需要加个u''表示unicode字符串,而py3中默认就是unicode(也就是str),不需要添加。
在py3中open函数功能更强大,可以使用encoding指定编码格式
Py3文件读写:
info = '你好'#open通过encoding参数自动编码成utf8 with open('H3','wt',encoding='utf8') as f: f.write(info) #读取文件的时候,自动解码成utf8,不要和上面存入时的编码搞混,文件里的数据显示的是连续的字节 with open('H3','rt',encoding='utf8') as f2: print(f2.read())
open打开方式中的‘wt’或’rt’中的’t’是默认方式,不写也按此方式打开(文本模式)