在“write”消息程序中使用 UTF-8 字符

在“write”消息程序中使用 UTF-8 字符

当我使用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 管道来实现这一点。

  1. 创建 FIFO 管道:
    mkfifo /tmp/fifo
    
  2. 让另一位用户在另一端收听。如果我们在这个管道上等待多条消息,为了方便起见,我们可以将 read pipeline 命令放入一个 for循环中,这样当侦听器收到EOF第一条消息时,bash 将自动再次连接到管道。需要时 可以使用Ctrl+中断此循环执行:C
    for ((i=0;i<100;i++)) do cat /tmp/fifo ; done
    
  3. 然后您可以发送任何 Unicode 文本消息,或将任何命令的输出重定向到此 FIFO 管道,例如:
    ls -l /bin/ > /tmp/fifo
    

相关内容