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

Bizarre behavior of python printing non-alphabetic ASCII characters

我有以下 Python 代码:

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

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

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

Esc 使用这些字符为终端创建一个特殊代码。

A terminal control code is a special sequence of characters that is printed (like any other text). If the terminal understands the code, it won't display the character-sequence, but will perform some action. You can print the codes with a simple echo command.

Terminal Codes

例如,

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

控制顺序因您使用的终端而异。

更多关于:

这是因为转义序列和character-encoding混淆了。

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

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

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

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

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

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

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