当我使用write
程序发送消息时,如何使用UTF-8字符?
我发送:
write user2
Ehilà! Com'è?
但接收者得到:
Message from user1@samehost on pts/1 at 21:08 ...
EhilM-CM- ! Com'M-CM-(?
该机器是相同的,并且LANG
在 konsole 中已经如此en_US.UTF-8
。
答案1
它似乎write
将高位解释为“元”(Meta+key 或Esckey)。快速查看源代码(wr_fputs()
中的函数write.c
)证实了这一点:控制字符显示为^X
,高位设置的字符显示为M-X
。恐怕区域设置、终端和编码与此无关。write
只是7位。
现在,我是一个 Unicode 迷,但这有点变态。write
只需打开目标 TTY 并写入它(没有涉及任何魔法)。没有简单的方法可以让控制远程 TTY 的进程理解字符编码。即使有,也不是所有编码都可以转换为所有其他编码。如果没有转换,将 KOI8-R 中的消息传输到 ISO-8859-1 控制台将失败。由于write
采用了简单的 70 年代方法,这就是我们得到的结果。
答案2
您可以通过使用 FIFO 管道来实现这一点。
- 创建 FIFO 管道:
mkfifo /tmp/fifo
- 让另一位用户在另一端收听。如果我们在这个管道上等待多条消息,为了方便起见,我们可以将 read pipeline 命令放入一个
for
循环中,这样当侦听器收到EOF
第一条消息时,bash 将自动再次连接到管道。需要时 可以使用Ctrl+中断此循环执行:Cfor ((i=0;i<100;i++)) do cat /tmp/fifo ; done
- 然后您可以发送任何 Unicode 文本消息,或将任何命令的输出重定向到此 FIFO 管道,例如:
ls -l /bin/ > /tmp/fifo