python打印非字母ASCII字符的奇怪行为

时间:2016-01-14 08:14:16

标签: python macos terminal ansi-escape

我有以下Python代码:

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

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

  • 在92和94,数字不打印。 http://i.stack.imgur.com/DzUew.png

  • 在99(字母c)处,一堆终端输出被删除。 http://i.stack.imgur.com/5XPy3.png

  • 在108(字母l)处,当前行跳过几行(但文本保持在下面)。 (没有得到合适的屏幕保护,如果有帮助,我会稍后添加一个)

  • 在128或129时,第一个字符开始被屏蔽。你必须输入一些东西(我键入" jjj")以防止在该行上发生这种情况。 http://i.stack.imgur.com/DRwTm.png

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

2 个答案:

答案 0 :(得分:1)

带有这些字符的

Esc为终端创建了一个特殊代码。

  

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

     

Terminal Codes

例如,

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

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

更多关于:

答案 1 :(得分:1)

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

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

  • escape c (重置终端)
  • escape ^ (开始隐私消息,导致其他字符被吃掉)

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

  • 0x9a 设备属性,导致字符被发送到主机。
  • 0x9b 控制序列发起人,通常被视为 escape [

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

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

为了娱乐,请参阅xterm FAQ:Interesting but misleading