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学习笔记》