EUC コードで保存されているデータがありまして、中に「髙」(所謂「ハシラダカ」)とか、EUC-JP ではサポートしていない文字が含まれていまして、Jcode を使った
$str = Jcode->new($str, 'euc')->utf8;
という変換では、「髙」(ハシラダカ)は UTF-8 に含まれているにも関わらず「?」と変換されてしまいます。というか、変換されません・・・が正しいか。
EUC-JP には「髙」という文字は「無い」ので、実際には計算式にしたがって EUC-JP のコード体系に合ったコードに変換されて保存されているんだけど、Jcode(実体は Encode)が「EUC-JP に本来含まれていない文字だから、変換せんもんね」と「?」を返してきちゃうわけですな。
そこで、この EUC-JP に、「NEC特殊文字」「NEC選定IBM拡張文字」という CP932 独自の文字(「髙」もこの中に含まれます)も含めた拡張文字コードセットが CP51932 です。
で、Jcode(Encode)で CP51932 も扱えるようにするには、別途 Encode::EUCJPMS というモジュールをインストールしてやらなければいけません。まあ、cpan コマンド一発やけどね。
# cpan Encode::EUCJPMSCPAN: Storable loaded ok (v2.15)Reading '/root/.cpan/Metadata'Database was generated on Fri, 11 Apr 2014 17:41:02 GMTCPAN: LWP::UserAgent loaded ok (v6.04)CPAN: Time::HiRes loaded ok (v1.9717)Fetching with LWP:<略>Installing /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Encode/EUCJPMS/EUCJPMS.bsInstalling /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Encode/EUCJPMS/EUCJPMS.soInstalling /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Encode/EUCJPMS.pmAppending installation info to /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/perllocal.podNARUSE/Encode-EUCJPMS-0.07.tar.gz/usr/bin/make install -- OK
で、終わり。
use Jcode;use Encode::EUCJPMS;
という具合にプログラムの頭で Jcode モジュールと Encode::EUCJPMS モジュールを読み込んでやれば、
$str = Jcode->new($str, 'euc')->utf8;
が、
$str = Jcode->new($str, 'cp51932')->utf8;
って書けるようになって、ちゃんと UTF-8 で「髙」が表示できるようになるわけです。