Jcode->new($s,'cp932')->z2hで絵文字が化ける件

困ったちゃんです。

絵文字を壊さずにsjis⇔utf8変換をしようと思ったわけです。

でついでに全角⇔半角もやろうと思ってタイトルの通りにやってみた所、$sに絵文字が含まれていると何故か絵文字が化けるのです。

なんで化けるんだ?と思ってz2h覗いてみたらびっくり仰天。

なななんと一旦文字コードeucに変換してEncode::JP::H2Zを使って全角⇔半角変換をし、元の文字コードに戻すということをやっているわけです。

なんでそんな実装になってるのかというとEncode::JP::H2Zがeucを前提としているからです。

Encode::JP::H2Zがutf8前提で作られてばモウマンタイなのですが・・・。

で、色々調べてみたら同じこと言ってる人もいたんだけど結局どーすんのが一番いいのかなぁと。

とりあえずUnicode::Japanese使って、

 use Unicode::Japanese;
 use Jcode;

 my $s = ...; # 絵文字入りの文字列

 $s = Unicode::Japanese->new($s,'sjis-imode')->z2hKana->sjis_imode;
 $s = Jcode->new($s,'cp932')->utf8; # Encode::decode('cp932',$s)でも可

で対応したんだけど、できればキャリアの判別とかしたくないんでcp932だけで処理したいのでつがねぇ・・・。