Yak!の日記: GNU screen と文字コード
CUI 使いなら使って損のないソフト、GNU screen。Cygwin 上でも GNU screen を使用しているのだが、端末からテキストをコピペしてファイルに保存しようとする際に、WAVE DASH - FULL WIDTH 問題のせいで、毎度毎度 「変換できない文字です」とか言われるのがいい加減嫌になった。ということで、Unicode との変換を Microsoft (Windows-31J)互換にしてみた。GNU screen cp932 変換版
当初は、cp932 というエンコーディング名を sjis とは別に作成し、既存の機能は変更しないようにしようと思っていたのだが、ちょっと手間がかかることが分かったので sjis での処理 を差し替えてしまった。
問題点は次の通り。
最近の多国語対応アプリなら Unicode を基本とするところだが、GNU screen では ISO 2022 が基本となっており、文字集合識別子と符号でもって文字を管理している。この場合 EUC のような ISO 2022 のサブセットは容易に扱うことが可能である。が、Shift_JIS のような非 ISO 2022 の符号化方式を扱うのは簡単ではない。実際、screen のソースコード中でも Shift_JIS 対応コードが分散した形となっている。で、Unicode との変換だが、screen では変換テーブルを文字集合ごとに持っており、内部バッファの文字集合識別子から変換テーブルを特定し変換を行っている。cp932 も sjis も文字集合として JIS X 0208 をベースとするため、内部バッファでは同じ表現になってしまい、利用する変換テーブルを分けることができない。もちろん cp932 に JIS X 0208 とは別の文字集合識別子を与え(実際、cp932 の文字集合は JIS X 0208 より拡張されているが)、Unicode との変換以外では JIS X 0208 と同じように扱う、というのも可能だが、直す部分が増えて色々と面倒になったのでとりあえずパス。
結局修正はあきらめてしまったのだが方法を考えているうちに、文字コード変換等について、集合とか写像とか、そういう形で定式化したりとかできないものかと、ふっと頭に浮かぶ。これらのコード間で変換する際に、保存される文字の集合はこれこれ、とか、同一のものと見なされる文字の集合がどうとか。まー、いちいち定式化するまでもないのかもしれないが。
GNU screen と文字コード More ログイン