Python学习笔记:Python字符编码问题的经验小结

时间:2023-01-05 20:20:20

Python的字符编码问题是一个很大的坑,特别是对于Python 2.X而言。造成这个问题的主要原因是我们没有统一的编码。

0x01 编码操作

这里我不讲编码的原理,简单易懂的可以看这里:字符串和编码
Python中的编码,其实可以粗分为两大类:Unicode和非Unicode。相互之间可以利用encode和decode进行转换。

#coding:utf-8

#前面限定了是utf-8
utf8_str='test'
#unicode字符串
unicode_str=u'测试'
#相互转换
utf8_str.decode('utf-8')
unicode_str.encode('utf-8')

0x02 编码识别

对于一段字符串,我们有时候并不好确定它真实的编码方式,最简单的办法就是使用chardet进行识别。

安装:

pip install chardet

使用起来也很简单:

#coding:utf-8

from chardet import detect
import urllib2

html=urllib2.urlopen('http://www.baidu.com').read()
print detect(html)

结果:

{'confidence': 0.99, 'encoding': 'utf-8'}

confidence显示的是别正确的概率。encoding是识别的结果。

0x03 需要注意的问题

(1)对字符串进行操作,比如拼接等,需要编码格式一致。这个很好理解,就不再赘述;
(2)当需要保存文本文件的时候,有时候并不知道是什么编码方式,建议使用二进制方式:

import urllib2

html=urllib2.urlopen('http://www.baidu.com').read()
with open('baidu.txt','wb') as f:
f.write(html)

(3)有些特殊的字符串可能非常奇怪,导致Python转换过程中无法处理,这种情况我们可以使用decode的特殊处理方法:

#coding:utf-8

test='u123\x01\u0000特殊'
print test.decode('utf-8','ignore')

(4)Windows系统的编码平台可能比较特殊,导致容易出现乱码,我们可以对字符串的输入输出这么处理:

import sys

#输出打印:info是unicode编码
def new_print(info):
print info.encode(sys.stdin.encoding)

#解码为unicode编码
def new_input(info):
print info.decode(sys.stdin.encoding)

0x04 后记

Python字符编码确实是一个让人头疼的问题,但是只要使用正确的方式,还是可以较好解决的。希望上面的内容对大家有所帮助。