为什么 python3 REPL 中的 print('\x9f') 会挂起 gnome-terminal?

为什么 python3 REPL 中的 print('\x9f') 会挂起 gnome-terminal?

xterm 不会挂起。echo -e '\x9f' 不会在 xterm 或 gnome 终端上挂起。非 REPL python3(尝试过 3.6、3.8、3.9)会截断字符串但不会挂起。IPython 7.13.0 也是如此

Gnome 终端版本是 3.36.2

那么发生了什么事?我在他们的错误跟踪器中找不到与此相关的 Python 或 Gnome Terminal 的错误。

答案1

python3print('\x9f')打印 U+009F 字符的 UTF-8 编码版本(假设您的语言环境设置为 UTF-8,这是一个非常合理的假设)。这与 打印的单个 0x9F 字节不同echo -e '\x9f',后者是无效的 UTF-8。

U+0080 .. U+009F 是控制字符,可能会导致后续数据被解释为参数,而不是要显示的字母。一些终端仿真器(例如 gnome-terminal)甚至在 UTF-8 中也支持这些控制字符,而其他一些终端仿真器(例如 xterm)在 UTF-8 中拒绝它们,并且只识别此编码中的 7 位干净对应物。哪一个是正确的可能值得商榷。

底线是:永远不要在终端上打印不可打印的内容(根据iswprint()或等效内容),除非您确切知道自己在做什么(例如,您的明确意图是打印转义序列)。并坚持使用 7 位干净的 C0 控制代码,而不是有问题的 C1 控制代码。

相关内容