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

python打印非字母ASCII字符的奇怪行为,python,macos,terminal,ansi-escape,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处,数字不打印 在99(字母c)时,一组终端输出被删除 在108处(字母l),当

我有以下Python代码:

for num in range(80, 150):
    input()
    print(num)
    print(chr(27))
    print(chr(num))
input()语句仅用于控制for循环的速度。我并不期望这会有什么特别的作用,但当循环命中某些数字时,打印ASCII字符(前面是ASCII 27)(即ESC字符)会发生一些意想不到的事情:

  • 在92和94处,数字不打印

  • 在99(字母c)时,一组终端输出被删除

  • 在108处(字母l),当前行向上跳了几行(但文本仍在下面)。(没有获得合适的屏幕盖,如果有帮助,我会在以后添加一个)

  • 在128或129处,第一个字符开始被屏蔽。您必须键入一些内容(我键入了“jjj”),以防止该行发生这种情况


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

Esc
用这些字符为终端生成一个特殊的代码

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

比如说,

  • ESC/=ST,字符串终止符(chr(92))
  • ESC^=PM,隐私信息(chr(94))
控制顺序根据您使用的终端不同而不同

更多关于:

  • ,

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

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

  • escapec(重置终端)
  • escape^(开始一条隐私消息,导致其他字符被吃掉)
在ISO-8859-1(和ECMA-48)中,128到159之间的字符字节被视为控制字符,称为
C1
控制。其中几个角色被视为与另一个角色组合的转义。
C1
和“另一个字符”之间的映射并不简单,但有趣的是

  • 0x9a
    这是设备属性,导致将字符发送到主机
  • 0x9b
    它是控制序列的发起方,通常被视为escape[
另一方面,128-159范围内的字节是UTF-8字符的合法部分。如果您的终端没有正确配置以匹配区域设置,您会发现您的终端响应控制序列

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

  • (特别是)
为了娱乐,您可以参考xterm常见问题解答: