IRC(Wide,Friend系)における半角カナ対応

先日(もうだいぶ前になるのですが)dankogai さんより

perl/Encode - 7bit-jis != iso-2022-jp
http://blog.livedoor.jp/dankogai/archives/51061651.html
http://perl-mongers.org/2008/06/perlencode_-_7bit-jis_iso-2022-jp.html

なる指摘をうけました。
その後 IRC での半角カナに関して調べなおし、ようやくまとめることができたので、ここに記しておきます。

1.私が勘違いしていた点

  • IRC(Wide,Friend系)のチャンネルでは ISO-2022-JP文字コードを使用する設定にすること
  • Windows でよく使われる IRC クライアントの LimeChat では、半角カナ入力時の指定ができること(詳細は後に記します)
  • 上の2点から ISO-2022-JP では半角カナの入力ができるものと思い込んでいました。

実際は、LimeChat では問題ありませんが、他の OS のクライアントソフトを使うと半角カナは化けていました。しかし、ここでなぜ化けているかという問題がわかっていませんでした。

2.「文字コード超研究」によってわかったこと

偶然、指摘を受けた後、書店にて下記の本に出会いました。(本当に時間があまって寄った書店に置いてあったため奇跡としか思えませんが)


こちらの書籍には、日本で使われている文字コードの解説が細かく記載されています。この書籍にて学んだ点は下記のとおりです

  • ISO-2202 は、エスケープシーケンスを用いて他の文字コード形式に切り替えて処理する仕様
  • ISO-2202 の規格に基づいて作られた文字コードISO-2022-JP( ISO-2202と ISO-2022-JP を混同させてはいけません)
  • 他にも ISO-2202 に準拠した文字コードがある
  • ISO-2202-JP では半角カナは含まれていない(dankogai さんより指摘を受けた内容)

3.IRC では?

話は変わって、IRC には大きく WIDE 系サーバ・Friend 系サーバ・FreeNode 系サーバがあります。他は個人やイントラネットで、草の根でサーバを立てて運営されている場合がありますが、それは今回除外します。FreeNode 系サーバは、昨年10(11?)月より日本語系チャンネルは UTF-8 を使おうという話になり、現在は UTF-8 のチャンネルのみになっていると思います。
WIDE 系サーバ・Friend 系サーバは、未だに ISO-2022-JP を使おうという話ですが、厳密にいうと ISO-2022-JP にいくつかのエスケープシーケンスを追加した形式に IRC クライアントが実装していることがわかりました。(非標準な拡張をしている)

  • ESC ( J で切り替え、片仮名に JIS X 0201 の8ビットコードを用いる
  • ESC ( J で切り替え、片仮名の部分を SO(Shift Out)、SI(Shift In) で挟み、 JIS X 0201 の7ビットコードを用いる。
  • ESC ( I で切り替え、片仮名にJIS X 0201 の7ビットコードを用いる

詳しくは、JIS X 0201 片仮名 の JISコード(として一般に知られているコード) の箇所にあります。
ためしに、バイナリデータで上記3パターンを作成し、

Encode::from_to($_, "jis", "euc-jp");

と呼び出した所、ESC ( I のみ正しく変換されました。そして、tiarrahttp://coderepos.org/share/browser/lang/perl/tiarra/)ではどうなっているのか確認したところ、3種類のエスケープに対応していました。

jis => (find_encoding('cp932-jis') ? 'cp932-jis' : '7bit-jis'),
http://coderepos.org/share/browser/lang/perl/tiarra/trunk/main/Tiarra/Encoding/Encode.pm

となっており、

package Tiarra::Encoding::Encode::CP932JIS;
http://coderepos.org/share/browser/lang/perl/tiarra/trunk/main/Tiarra/Encoding/Encode/CP932JIS.pm

jis と指定したときは、cp932-jis という独自エンコーディングを使用するようになっていました。CP932JIS クラスの処理で3種類のエスケープ処理に対応しているようです。

4.結論

  • IRC(WIDE・Friend)など ISO-2022-JP で動作するボットを自作し半角カナの対応が必要な場合、自作プログラムは UTF-8 で作成し、tiarra などの IRC ゲートウェイサーバプログラムを利用する
  • あるいは、3の内容を踏まえて自分で実装する

個人的には、このような状況のまま放置しないで、みんなUTF-8に移行しようよーと言いたい所ですが・・・

5.さいごに

ISO-2022-JP を勘違いしていることを指摘していただいた、dankogai さんに感謝します。