尝试打印 ASCII 字符 128 到 160,为什么它在 157 处停止?

Trying to print ASCII characters 128 to 160, why does it stop at 157?

我是 Python 的新手,我正在学习 coding/encoding、unicode、ascii 等等。 我想根据它们的代码并使用 chr() 函数打印 ASCII 字符。

def table_ascii():
    "procédure imprimant une table des caractères ascii avec leur valeurs"
    i = 127
    while i < 258:
        print(f"{i} -> {chr(i)}")
        i += 1

table_ascii()

很遗憾,结果是错误的。它在代码 157 处停止:

127 ->  
128 ->  
129 ->  
130 ->  
131 ->  
132 ->  

133 ->  

134 ->  
135 ->  
136 ->  
137 ->      
138 ->  
139 ->  
140 ->  
142 ->  
143 ->  
144 ->  
146 ->  
147 ->  
148 ->  
149 ->  
150 ->  
151 ->  
152 ->  
154 ->  
        155 ->  

157 ->

我理解这些代码 return 空白,但为什么他们停止进程?

设置:

当我 运行 这段代码在 Visual Studio 代码中时,脚本会通过 256 产生输出。但是在我的控制台 (Linux Mate) 中,它会阻塞。这对我来说很难理解...

如评论中所述,128 到 160 之间的字符是无人区。它们未在 Unicode 规范中定义,但它们可能对各种显示具有特殊含义。这就是 Unicode 不涉及它们的原因 - 游戏中使用了太多变量。

诸如 Linux xterm 之类的终端接受控制代码来执行诸如以彩色显示文本之类的操作。看着 Xterm Control Sequences 我们看到

Privacy Message (PM is 0x9e)

这是十进制的 158 和它的 xterms 8 位控制字符之一。这将启动一条“私人消息”,该消息一直持续到看到定义的字符串终止符为止。 xterm 没有实现“私人消息”,从您的输出来看,它只是忽略了作为该消息一部分的剩余输出。

这是 VT100 类型的东西。一些终端可能会执行一些操作。其他人可能有一个字符映射到那个八位位组。您不会找到任何一致的实现。

首先,ASCII 只能达到 127 (0x7F)。 chr() 实际上 returns Unicode 字符。

我认为问题是当打印 U+9D (157) 操作系统命令 (OSC) 时,您的终端启动一个控制字符串并等待字符串终止符,例如U+9C String Terminator、U+1B Escape 后接 U+5C 反斜杠,或 U+7 BEL.由于这些序列中的 none 稍后会打印,因此终端将停止显示输出。有关详细信息,请参阅维基百科上的 ANSI escape code § Fe Escape sequences and C1 control codes

Unicode 字符 U+80 (128) 到 U+9F (159) 是控制字符,这意味着它们通常不可打印,因此您一开始就不会获得合理的输出。