【发布时间】:2015-03-27 21:41:06
【问题描述】:
我只是无法理解函数 decode() 和 encode() 在 python2.7 上的工作原理
我尝试了以下语句
>>> s = u'abcd'
>>> s.encode('utf8')
'abcd'
>>> s.encode('utf16')
'\xff\xfea\x00b\x00c\x00d\x00'
>>> s.encode('utf32')
'\xff\xfe\x00\x00a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00d\x00\x00\x00'
直到这里,我认为很清楚; encode() 在对应的 utf-8/16/32 字节字符串中翻译一个 unicode 代码。
但是当我编码时:
>>> s.decode('utf8')
u'abcd'
>>> s.decode('utf16')
u'\u6261\u6463'
>>> s.decode('utf32')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/encodings/utf_32.py", line 11, in decode
return codecs.utf_32_decode(input, errors, True)
UnicodeDecodeError: 'utf32' codec can't decode bytes in position 0-3: codepoint not in range(0x110000)
为什么decode() 在 unicode 类型上的含义?为什么第一个(使用 utf8)工作而不是后者?是不是因为python内部使用utf-8存储unicode字符串?
最后一件事:
>>> s2 = '≈'
>>> s2
'\xe2\x89\x88'
幕后发生了什么? '≈' 不是 ascii 字符,那么 python 是否使用编码 sys.getfilesystemencoding() 返回隐式转换它?
【问题讨论】:
-
Martijn 的回答解释了这种情况。值得注意的是,这种混淆在 Python 3 中被清除了。在 Python 3 中,unicode 对象没有
decode方法,而字节对象没有encode方法,所以你不能不小心进行编码/解码方向错误。 -
你能不能不要继续扩大你的问题?
标签: python python-2.7 unicode encoding