「書き込み」メッセージプログラムでUTF-8文字を使用する

「書き込み」メッセージプログラムでUTF-8文字を使用する

writeプログラムを使用してメッセージを送信するときにUTF-8文字をどのように使用しますか?

私は次を送る:

write user2
Ehilà! Com'è?

しかし、受信者は以下を得る。

Message from user1@samehost on pts/1 at 21:08 ...
EhilM-CM- ! Com'M-CM-(?

マシンは同じで、LANGkonsoleでもすでに同じですen_US.UTF-8

答え1

write上位ビットを「メタ」(Meta+キーまたはキー)として解釈するようですEsc。ソースコード(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. 他のユーザーに相手の言葉を聞くようにしてください。このパイプで複数のメッセージを待機している場合は、便宜上、読み取りパイプラインコマンドを  forループに入れて、リスナーが最初のメッセージを受信すると、EOFbashが自動的にパイプに再接続されるようにすることができます。必要にCtrl応じて+を使用してこのループの実行を中止できます。C
    for ((i=0;i<100;i++)) do cat /tmp/fifo ; done
    
  3. その後、Unicodeテキストメッセージを送信するか、コマンドの出力をこのFIFOパイプにリダイレクトできます。たとえば、次のようになります。
    ls -l /bin/ > /tmp/fifo
    

関連情報