【问题标题】:Bizarre behavior of python printing non-alphabetic ASCII characterspython打印非字母ASCII字符的奇怪行为
【发布时间】:2016-01-14 08:14:15
【问题描述】:

我有以下 Python 代码:

for num in range(80, 150):
    input()
    print(num)
    print(chr(27))
    print(chr(num))

input() 语句仅用于控制 for 循环的执行速度。我不希望这会做任何特别的事情,但是当循环达到某些数字时,打印那个 ASCII 字符,前面是 ASCII 27(这是 ESC 字符)会做一些意想不到的事情:

我不知道为什么会发生这种情况,尽管我认为这与 ESC 字符与终端交互有关。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python macos terminal ansi-escape


    【解决方案1】:

    这是由于转义序列和字符编码之间的混淆。

    您的程序正在打印转义序列,包括

    • escapec(重置终端)
    • escape^(开始隐私消息,导致其他角色被吃掉)

    在 ISO-8859-1(和 ECMA-48)中,128 到 159 之间的字符字节被视为控制字符,称为C1 控件。其中一些被视为与 escape 结合另一个字符相同。 C1 和“另一个角色”之间的映射并不简单,但有趣的是

    • 0x9a 是设备属性,导致字符被发送到主机。
    • 0x9b 是控制序列的发起者,更常见的是escape[。

    另一方面,128-159 范围内的字节是 UTF-8 字符的合法部分。如果您的终端未正确配置以匹配 locale 设置,您会发现您的终端响应控制序列。

    OSX 终端实现(不记录...)许多标准控制序列。 XTerm 记录了这些(以及许多其他内容),因此您可能会发现以下内容很有用:

    为了娱乐,请参阅 xterm 常见问题解答:Interesting but misleading

    【讨论】:

      【解决方案2】:

      Esc 与这些字符组成一个特殊的终端代码。

      终端控制代码是一个特殊的字符序列 打印(与任何其他文本一样)。如果终端理解代码, 它不会显示字符序列,但会执行一些操作。 您可以使用简单的 echo 命令打印代码。

      Terminal Codes

      例如,

      • ESC/ = ST,字符串终止符 (chr(92))
      • ESC^ = PM,隐私消息 (chr(94)) 。

      控制序列根据您使用的终端而有所不同。

      更多:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 2010-12-14
        • 2014-09-14
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多