我在读这篇high rated post的文章unicodes
下面是一个图示:
$ python
>>> import sys
>>> print sys.stdout.encoding
UTF-8
>>> print '\xe9' # (1)
é
>>> print u'\xe9' # (2)
é
>>> print u'\xe9'.encode('latin-1') # (3)
é
>>>
解释如下:
(1) python outputs binary string as is, terminal receives it and tries to match its value with latin-1 character map. In latin-1, 0xe9 or 233 yields the character "é" and so that's what the terminal displays.
我的问题是:当encoding
是'UTF-8'
时,为什么终端与拉丁语1字符映射匹配?在
当我试过的时候
^{pr2}$我得到的第一个结果与上面描述的不同。为什么会出现这种差异,在这张图片中latin-1
在哪里发挥作用?在
您缺少一些重要的上下文;在这种情况下,OP配置了终端仿真器(Gnome terminal)以将输出解释为Latin-1,但将shell变量设置为UTF-8。因此,shell告诉Python使用UTF-8进行Unicode输出,但是终端的实际配置是使用拉丁语-1字节。在
print
输出清楚地表明终端正在使用拉丁语-1解释输出,而使用UTF-8的是而不是。在当终端设置为UTF-8时,
\xe9
字节不是有效的(不完整的)UTF-8,而您的终端通常会打印一个问号:如果您指示Python忽略这些错误,它将为您提供U+FFFD替换字符glyph
^{pr2}$�
:这是因为在UTF-8中,
\xe9
是3字节编码的起始字节,对于Unicode代码点U+9000到U+9FFF,如果只打印为单个字节是无效的。这是有效的:因为这是U+9000码位的UTF-8编码,一种中日韩象形文字符号。在
如果您想了解编码和Unicode的区别,以及UTF-8和其他编解码器的工作原理,我强烈建议您阅读:
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)作者:Joel Spolsky
Python Unicode HOWTO
Pragmatic Unicode作者:Ned Batchelder
相关问题 更多 >
编程相关推荐