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だけで処理したいのでつがねぇ・・・。