Perl で IBM拡張文字を EUC から UTF-8 に変換する[Perl]
(2015-01-15 19:33:50) by shinoda
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::EUCJPMS
CPAN: Storable loaded ok (v2.15)
Reading '/root/.cpan/Metadata'
Database was generated on Fri, 11 Apr 2014 17:41:02 GMT
CPAN: 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.bs
Installing /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Encode/EUCJPMS/EUCJPMS.so
Installing /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Encode/EUCJPMS.pm
Appending installation info to /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/perllocal.pod
NARUSE/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 で「?」が表示できるようになるわけです。
コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る
Powered by
MT4i 3.0.8