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

0 投票
3 回答
1499 浏览
提问于 2025-04-18 11:54

我在玩字符串格式化的东西。其实我想理解下面这段代码:

mystring  = "\x80" * 50;
print mystring

输出结果:

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

输出结果是一串欧元符号。但是为什么会这样呢?我知道这不是ASCII码,另外我在想的是,为什么它不打印出十六进制的\x80呢?提前谢谢你们!

3 个回答

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(或者类似的)表中被查找。

1

这要看你的终端编码是什么……在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
2

关于第一个问题,\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

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

撰写回答