IRCでは半角カナの使用は推奨されてないが,Windowsでユーザの多いLimeChatでもわざわざ設定を設けて半角カナを使えるようにしているため,一応対策してみる.
LimeChatで使うものは半角カナ(JISX0201)混じりのJISのようなので,JIS+JISX0201決め打ちで変換するようにしてある.
まずは半角カナを全角カナに変換してしまう訳だが,LimeChatでは半角カナのエスケープシーケンスとして’ESC-(-J’と’ESC-(-I’とが使える(正規表現では\e\([JI]))みたいなのでそのどちらかが出て来たら,次のエスケープシーケンスまでの部分を全角カナに変換してしまう.そうすると残りは半角カナのないただのJISとなるのでEUC-JPに変換してしまうだけである.
ただし,’ESC-(-J’で使われる半角カナには8bitの物(SJISで使用されてる部分)と7bitの物(JISで使われている部分)があり,’ESC-(-I’はそのままJISの半角となっているようである.’ESC-(-J’の7bitの方(SI/SO付加されてる)はそのままだと変換できないので,’ESC-(-I’と同じだという理由で’ESC-(-I’に変換してしまって後でまとめて変換するようにした.
文字コードの変換はJcode.pmモジュールを使うとして(Encode.pmモジュールでもいいが,半角カナ->全角カナの変換が面倒なので)コードは次のようになる.
use Jcode; $re_han = '\e\([JI]'; $jcode = new Jcode; # この時点で $str は半角カナ混じりのJIS $str =~ s/$re_han([^\e]*)/$jcode->set($1, 'jis0201-raw')->h2z->jis/geo; # この時点で $str は半角カナなしのJIS $str = $jcode->set($str, 'jis')->euc; # これで $str は半角カナなしのEUC-JPになった