【问题标题】:Why does this string gets printed out like this?为什么这个字符串会这样打印出来?
【发布时间】:2014-08-23 15:13:05
【问题描述】:

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

mystring  = "\x80" * 50;
print mystring

输出:

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

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

【问题讨论】:

  • John Machin here\x80 的编码进行了非常详尽的解释。

标签: python


【解决方案1】:

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

编辑: @Joran Besley 是对的,所以让我改写一下:

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

事实上:

unicode(u'\u0080')
>>> u'\x80'

这是因为 Python \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

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

【讨论】:

  • u"\x80" != "\x80" ...提醒一下...您编辑的答案比最初的答案+1有了很大改进
  • 我决定将此答案标记为正确,因为它是更详细的解释..
【解决方案2】:

这取决于你的终端编码...在 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

【讨论】:

  • 您能否再进一步描述一下?我的意思是,当我在 bash 上打印它时,它只是一个方块。我猜这是 unicode 或类似的东西?
【解决方案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(或类似)表中查找字符串。

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 2020-11-08
    • 1970-01-01
    • 2021-12-08
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多