python中的latin1与unicode

2024-09-29 20:32:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读这篇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在哪里发挥作用?在


Tags: andthesys文章ratedpostterminalutf
1条回答
网友
1楼 · 发布于 2024-09-29 20:32:22

您缺少一些重要的上下文;在这种情况下,OP配置了终端仿真器(Gnome terminal)以将输出解释为Latin-1,但将shell变量设置为UTF-8。因此,shell告诉Python使用UTF-8进行Unicode输出,但是终端的实际配置是使用拉丁语-1字节。在

print输出清楚地表明终端正在使用拉丁语-1解释输出,而使用UTF-8的是而不是。在

当终端设置为UTF-8时,\xe9字节不是有效的(不完整的)UTF-8,而您的终端通常会打印一个问号:

>>> import sys
>>> sys.stdout.encoding
'UTF-8'
>>> print '\xe9'
?
>>> print u'\xe9'
é
>>> print u'\xe9'.encode('utf8')
é

如果您指示Python忽略这些错误,它将为您提供U+FFFD替换字符glyph

^{pr2}$

这是因为在UTF-8中,\xe9是3字节编码的起始字节,对于Unicode代码点U+9000到U+9FFF,如果只打印为单个字节是无效的。这是有效的:

>>> print '\xe9\x80\x80'
退

因为这是U+9000码位的UTF-8编码,一种中日韩象形文字符号。在

如果您想了解编码和Unicode的区别,以及UTF-8和其他编解码器的工作原理,我强烈建议您阅读:

相关问题 更多 >

    热门问题