Perl で IBM拡張文字を EUC から UTF-8 に変換する

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 で「髙」が表示できるようになるわけです。
Clip to Evernote

トラックバック(0)

このブログ記事を参照しているブログ一覧: Perl で IBM拡張文字を EUC から UTF-8 に変換する

このブログ記事に対するトラックバックURL: http://blog.netandfield.com/mt/mt-tb.cgi/3277

コメントする

このブログ記事について

このページは、shinodaが2015年1月15日 19:33に書いたブログ記事です。

ひとつ前のブログ記事は「「廣島弐番」の1月の限定ラーメンも抜群の美味さであった」です。

次のブログ記事は「ジビエ祭り」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら