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