perlで半角カナ混じりのJISをEUC-JPに変換する

2006年 5月 08日(月曜日) 22:57 CrapeMyrtle Tips - プログラミング
印刷

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になった
最終更新 2010年 3月 19日(金曜日) 01:48