我正在玩字符串格式化。实际上,我试图理解以下代码:
mystring = "\x80" * 50;
print mystring
输出:
>>>
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
>>>
输出是一串欧元唱歌。但为什么会这样呢?这不是ASCII afaik,我问自己的另一个问题是为什么它不打印hex \ x80?提前致谢
答案 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(或类似)表中查找字符串。