为什么这个字符串会这样打印出来?
我在玩字符串格式化的东西。其实我想理解下面这段代码:
mystring = "\x80" * 50;
print mystring
输出结果:
>>>
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
>>>
输出结果是一串欧元符号。但是为什么会这样呢?我知道这不是ASCII码,另外我在想的是,为什么它不打印出十六进制的\x80呢?提前谢谢你们!
3 个回答
在IDLE里稍微动了一下,得到了这个输出。
>>> a = "\x80"
>>> a
'\x80'
>>> print a * 50
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
>>> print a
€
>>>
首先引人注意的是那个'\'字符。这个字符是用来在字符串中转义其他字符的。你可以通过下面的链接了解转义字符的相关知识。
http://en.wikipedia.org/wiki/Escape_character
稍微改变一下字符串,就能看出转义的效果了。
>>> print '\x8'
ValueError: invalid \x escape
我觉得发生的事情是,转义让字符串在ASCII(或者类似的)表中被查找。
这要看你的终端编码是什么……在Windows终端中,它会把一些字符编码成C-cedilla的样子。
如果你想看到"\x80",可以用print 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
。你可以在这个链接找到一个不错的解释:Python字符串中的字节和Unicode.
编辑:@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
我希望这能弥补我的错误。