Python编码详解
2015-01-22 16:32
Python
编码
Unicode
UTF-8
摘要:Python 2.x 的编码问题让人头大,详细梳理一下默认编码、str 与 unicode 的 encode/decode 转换,以及 codecs 模块处理 BOM 的方法。
Python 2.x 默认采用了 ASCII 编码。为了完成编码转换,必须和操作系统字符编码统一起来。
>>> import sys, locale
>>> sys.getdefaultencoding() # Python 默认编码
'ascii'
>>> c = locale.getdefaultlocale(); c # 获取当前系统编码
('zh_CN', 'UTF-8')
>>> reload(sys) # setdefaultcoding 在被初始化时被 site.py 删掉了
<module 'sys' (built-in)>
>>> sys.setdefaultencoding(c[1]) # 重新设置默认编码
str、unicode 都提供了 encode 和 decode 编码转换方法
- encode: 将默认编码转换为其他编码
- decode: 将默认或者指定编码字符串转换为 unicode
>>> s = "中国人"; s
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> u = s.decode(); u # UTF-8 -> UNICODE
u'\u4e2d\u56fd\u4eba'
>>> gb = s.encode('gb2312'); gb # UTF-8 -> GB2312
'\xd6\xd0\xb9\xfa\xc8\xcb'
>>> gb.encode('utf-8') # encode 会把 gb 当做默认 UTF-8 编码,所以出错
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
>>> gb.decode('gb2312') # 可以将其转换成 UNICODE
u'\u4e2d\u56fd\u4eba'
>>> gb.decode('gb2312').encode() # 然后再转换成 UTF-8
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> unicode(gb, 'gb2312') # GB2312 -> UNICODE
u'\u4e2d\u56fd\u4eba'
>>> u.encode() # UNICODE -> GB2312
'\xd6\xd0\xb9\xfa\xc8\xcb'
标准库另有 codecs 模块用来处理更复杂的编码转换,比如大小端和BOM
from codecs import BOM_UTF32_LE
>>> s = '中国人'
>>>s
'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> s.encode('utf-32')
'\xff\xfe\x00\x00-N\x00\x00\xfdV\x00\x00\xbaN\x00\x00'
>>> BOM_UTF32_LE
'\xff\xfe\x00\x00'
>>> s.encode('utf-32').decode('utf-32')
u'\u4e2d\u56fd\u4eba'
文章摘选《Python学习笔记》