zer*_*uno 2 python unicode encoding python-2.7
我只是无法得到python2.7 的功能decode()和encode()工作方式
我尝试了以下声明
>>> 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'
Run Code Online (Sandbox Code Playgroud)
直到这里,我认为很清楚; 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)
Run Code Online (Sandbox Code Playgroud)
为什么decode()unicode类型的含义?为什么第一个(使用utf8)而不是后者?是因为python在内部使用utf-8存储unicode字符串吗?
最后一件事:
>>> s2 = '?'
>>> s2
'\xe2\x89\x88'
Run Code Online (Sandbox Code Playgroud)
引擎盖下会发生什么?'≈'不是ascii字符,因此python使用编码sys.getfilesystemencoding()返回隐式转换它吗?
你正在呼唤decode一个unicode字符串.Python的有益第一编码使用默认的ASCII编码解码器,让你有实际的字节串来解码.您无法解码Unicode数据本身,它已经被解码.
然后解码失败,因为字节不是有效的UTF-32数据.bytestring 'abcd'可以解码为UTF-8,因为ASCII是UTF-8的子集.编码为ASCII然后解码为UTF-8产生相同的信息.解码为UTF-16碰巧偶然发挥作用; 你提供了4个字节,其中十六进制值为0x61,0x62,0x63和0x64(字符的ASCII值abcd),这些字节可以解码为UTF-16 little endian for \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)
Run Code Online (Sandbox Code Playgroud)
因为对bytestring的隐式编码失败了.
在Python 3中,unicode对象已重命名为str,并且str.decode()已从该类型中删除该方法以防止此类混淆.只剩下str.encode().Python str类型已被类型替换,该bytes类型只有一个bytes.decode()方法.
第二个示例显示您在终端或控制台中以交互方式使用Python解释器.Python从终端接收您的输入为UTF-8字节,并将这些字节存储在bytestring中.如果您使用了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
?
Run Code Online (Sandbox Code Playgroud)
反之亦然,当打印sys.stdout.encoding编解码器时,用于将Unicode字符串自动编码为终端使用的编解码器,然后再次解释这些字节以在屏幕上显示正确的字形.
如果您不使用Python交互式解释器,而是使用Python源文件,则使用的编解码器由PEP-263 Python源代码编码声明确定,因为Python 2否则默认将字节解码为ASCII.
sys.getfilesystemencoding()与这一切无关; 它告诉你Python认为你的文件系统元数据是用什么编码的; 例如目录中的文件名.当您使用unicode与文件系统相关的调用的路径时,将使用这些值os.listdir().