Python 为什么这个字符串会这样打印出来?

Python 为什么这个字符串会这样打印出来?,python,Python,我正在玩弄字符串格式。实际上,我正在努力理解以下代码: mystring = "\x80" * 50; print mystring 输出: >>> €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ >>> 输出是一串欧元符号。但为什么会这样呢?这不是ASCII afaik,我问自己的另一个问题是为什么它不打印十六进制\x80?提前感谢这取决于您的终端编码。。。在windows终端中,编码为一组C-c

我正在玩弄字符串格式。实际上,我正在努力理解以下代码:

mystring  = "\x80" * 50;
print mystring
输出:

>>> 
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
>>>

输出是一串欧元符号。但为什么会这样呢?这不是ASCII afaik,我问自己的另一个问题是为什么它不打印十六进制\x80?提前感谢

这取决于您的终端编码。。。在windows终端中,编码为一组C-cedilla

如果您想查看“\x80”,可以
打印repr(mystring)

此外,0x80=128,这是欧元的(非ascii,因为ascii在技术上仅适用于0x7f)值

具体来说,这就是“Windows-1252”对欧元符号的编码方式(实际上,几乎所有的“Windows-125x”都是这样编码的)

这个答案有更多的信息

此外,还可以将其转换为unicode

unicode_ch = "\x80".decode("Windows-1252")  #it is now decoded into unicode
print repr(unicode_ch) # \u20AC  the unicode equivalent of Euro
print unicode_ch #as long as your terminal can handle it

这取决于你的终端编码。。。在windows终端中,编码为一组C-cedilla

如果您想查看“\x80”,可以
打印repr(mystring)

此外,0x80=128,这是欧元的(非ascii,因为ascii在技术上仅适用于0x7f)值

具体来说,这就是“Windows-1252”对欧元符号的编码方式(实际上,几乎所有的“Windows-125x”都是这样编码的)

这个答案有更多的信息

此外,还可以将其转换为unicode

unicode_ch = "\x80".decode("Windows-1252")  #it is now decoded into unicode
print repr(unicode_ch) # \u20AC  the unicode equivalent of Euro
print unicode_ch #as long as your terminal can handle it

至于第一个问题,
\x80
被解释为
\u0080
。一个很好的解释可以在

编辑: @乔兰·贝斯利是对的,让我换一种说法:

u'\x80'
等于
u'\u0080'

事实上:

unicode(u'\u0080')
>>> u'\x80'
这是因为Python<3更喜欢
\x
在可能的情况下作为Unicode字符的转义表示,只要代码点小于256。之后,它使用正常的
\u

unicode(u'\u2019')
>>> u'\u2019' # curved quotes in windows-1252
字符映射的位置取决于终端编码。正如Joran所说,您可能正在使用
Windows-1252
或类似的东西,其中欧元符号是十六进制字节0x80。例如,在
iso-8898-15
中,十六进制值为0xa4:

"\xa4".decode("iso-8859-15") == "\x80".decode('windows-1252')
>>> True
如果您对终端编码感到好奇,可以从
sys

import sys
sys.stdin.encoding
>>> 'UTF-8' # my terminal
sys.stdout.encoding
>>> 'UTF-8' # same as above

我希望它能弥补我的错误。

至于第一个问题,
\x80
被解释为
\u0080
。一个很好的解释可以在

编辑: @乔兰·贝斯利是对的,让我换一种说法:

u'\x80'
等于
u'\u0080'

事实上:

unicode(u'\u0080')
>>> u'\x80'
这是因为Python<3更喜欢
\x
在可能的情况下作为Unicode字符的转义表示,只要代码点小于256。之后,它使用正常的
\u

unicode(u'\u2019')
>>> u'\u2019' # curved quotes in windows-1252
字符映射的位置取决于终端编码。正如Joran所说,您可能正在使用
Windows-1252
或类似的东西,其中欧元符号是十六进制字节0x80。例如,在
iso-8898-15
中,十六进制值为0xa4:

"\xa4".decode("iso-8859-15") == "\x80".decode('windows-1252')
>>> True
如果您对终端编码感到好奇,可以从
sys

import sys
sys.stdin.encoding
>>> 'UTF-8' # my terminal
sys.stdout.encoding
>>> 'UTF-8' # same as above

我希望它能弥补我的错误。

在空闲时稍加修改就产生了这个输出

>>> a = "\x80"
>>> a
'\x80'
>>> print a * 50
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
>>> print a
€
>>> 
首先突出的是“\”字符。此字符用于转义字符串中的字符。您可以在下面的链接中了解转义字符

稍微更改字符串会告诉我们正在发生转义

>>> print '\x8'
ValueError: invalid \x escape

我认为正在发生的是转义导致字符串在ASCII(或类似)表中查找。

在IDLE中稍加修改就产生了此输出

>>> a = "\x80"
>>> a
'\x80'
>>> print a * 50
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
>>> print a
€
>>> 
首先突出的是“\”字符。此字符用于转义字符串中的字符。您可以在下面的链接中了解转义字符

稍微更改字符串会告诉我们正在发生转义

>>> print '\x8'
ValueError: invalid \x escape

我认为正在发生的是转义导致字符串在ASCII(或类似)表中查找。

您能进一步描述一下吗?我的意思是,当我在bash上打印这个时,它只是一块正方形。我猜这是unicode或类似的东西?你能再进一步描述一下吗?我的意思是,当我在bash上打印这个时,它只是一块正方形。我猜这是unicode或类似的东西?
u“\x80”!=“\x80”
。。。只是提醒一下。。。您编辑的答案比初始答案提高了很多+1我决定将此答案标记为正确答案,因为这是一个更详细的解释。
u“\x80”!=“\x80”
。。。只是提醒一下。。。您编辑的答案比初始答案提高了很多+1我决定将此答案标记为正确答案,因为这是一个更详细的解释。John Machin对
\x80
的编码有非常透彻的解释。John Machin对
\x80
的编码有非常透彻的解释。