你调用
depre一个
unipre字符串。Python的有益第一 编码 使用默认的ASCII编码解码器,让你有实际字节的字符串 来
解码。您无法解码Unipre数据本身,因为它 已经被 解码。
由于字节不是有效的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的数据,则会出现
UnipreEnpreError异常;注意该名称中的 编码 :
>>> u'åßç'.depre('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 depre return precs.utf_8_depre(input, errors, True)UnipreEnpreError: 'ascii' prec can't enpre characters in position 0-2: ordinal not in range(128)因为对字节字符串的隐式编码失败。
在Python
3中,
unipre对象已重命名为
str,并且该
str.depre()方法已从类型中删除,以防止此类混淆。只有
str.enpre()遗体。Python
str类型已被
bytes仅具有
bytes.depre()方法的类型所代替。
第二个示例显示您正在终端或控制台中交互使用Python解释器。Python从终端接收的输入为UTF-8字节,并将这些字节存储在字节串中。如果您使用
unipre文字,Python会使用为终端声明的编码自动解码这些字节。您可以内省
sys.stdin.encoding一下Python检测到的内容:
>>> import sys>>> sys.stdin.encoding'UTF-8'>>> s = '≈'>>> s'xe2x89x88'>>> s = u'≈'>>> su'u2248'>>> print s≈
反之亦然,当打印
sys.stdout.encoding编解码器时,它用于将Unipre字符串自动编码为终端所使用的编解码器,然后,编解码器再次解释这些字节,以在屏幕上显示正确的字形。
如果您不是在Python交互式解释器中工作,而是在使用Python源文件,则使用的编解码器将由PEP-263
Python源代码编码声明确定 ,因为Python
2否则默认将字节解码为ASCII。
sys.getfilesystemencoding()与这一切无关;它告诉您Python认为您的 文件系统元数据
被编码的方式;例如目录中的文件名。当您将
unipre路径用于与文件系统相关的调用(例如)时,将使用这些值
os.listdir()。


![了解解码()和编码()Unicode [重复] 了解解码()和编码()Unicode [重复]](http://www.mshxw.com/aiimages/31/668497.png)
