在\u
有效的 shell(bash +4.3、ksh93 或 zsh)中,我们可以打印 Unicode 字符:
$ printf 'a b c \ua0 \ua1 \ua2 \ua3 \n'
a b c ¡ ¢ £
这是来自Latin-1_Supplement范围的一些字符。
但是,一旦9f
添加了 Unicode 字符,打印就会停止,直到 Unicode9c
被打印出来。
\u9f
和\u9c
(APC 和 ST) 都是控制C1
字符。
$ printf 'a b c \u9f d e f \u9c \ua0 \ua1 \ua2 \ua3 \n'
a b c ¡ ¢ £
字符 def 消失。
可以肯定的是,它printf
正在生成所有字符,并且将输出重定向到其他一些软件(而不是终端)将显示生成的字符:
$ printf 'a b c \u9f d e f \u9c \ua0 \ua1 \ua2 \ua3 \n' | od -A n -tx1
61 20 62 20 63 20 c2 9f 20 64 20 65 20 66 20 c2
9c 20 c2 a0 20 c2 a1 20 c2 a2 20 c2 a3 20 0a
这足以证明正在生成字符。那么,为什么它们没有被打印(显示有一些可见的字形)?
我的问题是:
- 实际上是
APC
连接到ST
。它在哪里定义? - 这两个字符之间的字符是否发送到某个应用程序?
- 如果是这样,适用于哪个应用程序?
- 谁负责这种重定向?外壳,终端或其他东西?
编辑
和终端都xterm
不会konsole
删除d e f
字符。
这证实这是终端应用程序的内部问题,而不是外壳。还没有找到定义的地方。