发表于2016年 05月 29日
Python2.7中的字符串编码问题的关键是:
str其实并不是字符串而是字节串(八位二进制数据串),而Unicode字符串对象才是真正的字符串。
所以只要弄清楚str字节串中保存的到底是什么编码格式的二进制数据即可解决编码问题。
1,源码文件(.py.pyw)编码问题。
只要保证文件编码为无BOM的utf-8格式,然后在源码的第一行加上
# -*- coding: utf-8 -*-
就可以保证正常读取utf-8编码编码的数据了,用utf-8格式解码其中的字符串就可以得到Unicode字符串对象了。
# -*- coding: utf-8 -*-
print type('中文'.decode('utf-8'))
2,读取文本文件或者获取网上的字符数据的编码问题。
其实和读取源代码文件时一样,只是源代码文件第一行说明了编码格式而这时没有,需要自行判断。
文件编码格式可以通过notepad2记事本查看确认,网络文本可以根据网页head中的信息确认编码格式,然后相应处理即可。
用二进制方式(wb,rb)读取文件数据(可以避免一些字符方式(w,r)时Python2默认以ASCII编码格式读取文件字符引起的问题,例如不同平台的换行符问题),然后根据实际编码格式解码得到Unicode字符串对象(保存文件一律默认使用utf-8编码格式)。
# -*- coding: utf-8 -*-
with open('1.txt','wb')as f:
f.write(u'中文'.encode('utf8'))
with open('1.txt','rb')as f:
print type(f.read().decode('utf8'))
网络文本读取推荐用requests库,然后根据实际编码格式解码得到Unicode字符串对象。
# -*- coding: utf-8 -*-
import requests
response = requests.get('http://www.baidu.com')
response.encoding = 'utf8'#'gbk'等等
print type(response.text)
3,控制台输出的编码问题。
输出Unicode字符串对象就好了,它会输出对应系统平台默认编码的字符串数据
例如Windows的cmd窗口下运行以下代码程序
# -*- coding: utf-8 -*-
print 'abc中文'#utf-8编码的字符串数据
print u'abc中文'
会有输出:
abc涓枃
abc中文
4,强调一下,Unicode字符串对象才是真正的字符串!
# -*- coding: utf-8 -*-
print len('abc中文')#str,9
print 'abc中文'[:-1]#输出的最后一个字符是乱码
print len(u'abc中文')#Unicode字符串对象,5
print u'abc中文'[:-1]#输出abc中
得到Unicode字符串对象方法
# -*- coding: utf-8 -*-
print u'abc中文'#定义Unicode字符串对象
print 'abc中文'.decode('utf-8')#解码获取Unicode字符串对象
print 'abc中文', 'utf-8')#用unicode()方法获取Unicode字符串对象
最后总结一下,
读取到字节串数据后根据实际编码格式解码(decode)成Unicode字符串对象,使用Unicode对象处理字符串,输出到控制台时用Unicode字符串对象,保存数据到文件时将字符串编码(encode)成utf-8编码格式字节串数据。
更精简的:
读写都是用的八位二进制字节串数据,通过编解码与Unicode字符串对象相互转换,程序中尽量使用Unicode字符串对象。
Python2的字符串编码的坑大概就这些了,还是会继续使用Python2,因为用print
不想加括号╮(╯_╰)╭