了解解码()和编码()Unicode [重复]
这个问题已经在这里有了答案 :
Unicode错误序数不在范围内 (1个答案)
3年前关闭。
我只是无法了解其功能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()
将Unicode代码转换为相应的utf-8 / 16/32字节字符串。
但是当我编写代码时:
>>> 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()
返回值隐式转换它吗?
-
你调用
decode
一个unicode
字符串。Python的有益第一 编码 使用默认的ASCII编码解码器,让你有实际字节的字符串 来
解码。您无法解码Unicode数据本身,因为它 已经被 解码。由于字节不是有效的UTF-32数据,因此解码失败。字节串
'abcd'
可解码为UTF-8,因为ASCII是UTF-8的子集。编码为ASCII然后解码为UTF-8会产生相同的信息。由于UTF-16解码偶然发生了;您提供了4个字节,其十六进制值分别为0x61、0x62、0x63和0x64(字符的ASCII值abcd
),并且这些字节可以被解码为UTF-16
little endian\u6261
和\u6463
。但是在UTF-32编码系统中,这4个字节没有有效的解码。如果
s
其中包含无法先编码为ASCII的数据,则会出现UnicodeEncodeError
异常;注意该名称中的 编码 :>>> u'åßç'.decode('utf8') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
因为对字节字符串的隐式编码失败。
在Python
3中,unicode
对象已重命名为str
,并且该str.decode()
方法已从类型中删除,以防止此类混淆。只有str.encode()
遗体。Pythonstr
类型已被bytes
仅具有bytes.decode()
方法的类型所代替。第二个示例显示您正在终端或控制台中交互使用Python解释器。Python从终端接收的输入为UTF-8字节,并将这些字节存储在字节串中。如果您使用
unicode
文字,Python会使用为终端声明的编码自动解码这些字节。您可以内省sys.stdin.encoding
一下Python检测到的内容:>>> import sys >>> sys.stdin.encoding 'UTF-8' >>> s = '≈' >>> s '\xe2\x89\x88' >>> s = u'≈' >>> s u'\u2248' >>> print s ≈
反之亦然,当打印
sys.stdout.encoding
编解码器时,它用于将Unicode字符串自动编码为终端所使用的编解码器,然后,编解码器再次解释这些字节,以在屏幕上显示正确的字形。如果您不是在Python交互式解释器中工作,而是在使用Python源文件,则使用的编解码器将由PEP-263
Python源代码编码声明确定 ,因为Python
2否则默认将字节解码为ASCII。sys.getfilesystemencoding()
与这一切无关;它告诉您Python认为您的 文件系统元数据
被编码的方式;例如目录中的文件名。当您将unicode
路径用于与文件系统相关的调用(例如)时,将使用这些值os.listdir()
。