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

时间:2014-07-02 17:46:48

标签: python

我正在玩字符串格式化。实际上,我试图理解以下代码:

mystring  = "\x80" * 50;
print mystring

输出:

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

输出是一串欧元唱歌。但为什么会这样呢?这不是ASCII afaik,我问自己的另一个问题是为什么它不打印hex \ x80?提前致谢

3 个答案:

答案 0 :(得分:2)

关于第一个问题,\x80被解释为\u0080。可以在Bytes in a unicode Python string找到一个很好的解释。

修改 @Joran Besley是对的,所以让我重新说一下:

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

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

答案 1 :(得分:1)

这取决于您的终端编码...在windows终端中编码为一堆C-cedilla的

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

此外0x80 = 128这是(不是ascii,因为ascii只是技术上转到0x7f)欧元的值

特别是“Windows-1252”如何编码欧元符号(实际上显然几乎所有“Windows-125x”编码欧元符号)

这个答案有更多信息

Hex representation of Euro Symbol €

此外,您可以将其转换为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

答案 2 :(得分:1)

IDLE的一点点修改产生了这个输出。

>>> a = "\x80"
>>> a
'\x80'
>>> print a * 50
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
>>> print a
€
>>> 

首先突出的是'\'字符。此字符用于转义字符串中的字符。您可以在下面的链接中了解有关转义字符的信息。

http://en.wikipedia.org/wiki/Escape_character

稍微更改字符串会告诉我们正在进行转义。

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

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