尝试打印 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 空白,但为什么他们停止进程?
设置:
- Python 3.8.10(默认,2021 年 9 月 28 日,16:10:42)
linux
上的 [GCC 9.3.0]
- 使用 VIM - Vi IMproved 8.1
当我 运行 这段代码在 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) 是控制字符,这意味着它们通常不可打印,因此您一开始就不会获得合理的输出。
我是 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 空白,但为什么他们停止进程?
设置:
- Python 3.8.10(默认,2021 年 9 月 28 日,16:10:42) linux 上的 [GCC 9.3.0]
- 使用 VIM - Vi IMproved 8.1
当我 运行 这段代码在 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) 是控制字符,这意味着它们通常不可打印,因此您一开始就不会获得合理的输出。