Python编码详解

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 编码转换方法

  1. encode: 将默认编码转换为其他编码
  2. 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学习笔记》

发表评论

电子邮件地址不会被公开。 必填项已用*标注