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 字符)会做一些意想不到的事情:
在 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 字符与终端交互有关。有人可以帮我解决这个问题吗?
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.
例如,
- 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
我有以下 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 字符与终端交互有关。有人可以帮我解决这个问题吗?
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.
例如,
- 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