とあるeuc-jpなXMLをXML::Simpleでパースしようとしたら、以下のようなエラーが出た。
input conversion failed due to input error, bytes 0xAD 0xD4 0xA4 0xD8
これはタイトルなどに「Д」という機種依存な文字が含まれていたのがいけないらしい。 同じ機種依存文字「⊿(\Delta)」で困っている人もいたみたい→日記やblogのタイトルに機種依存文字や長文を入れるのはやめてほしいなあという話 - HsbtDiary (2006-05-30)。
XML::LibXMLではmiyagawaさんがその辺を解決しているようで、それを参考にXML::Simpleを使ってでも「euc-jpのフィールドに出現する機種依存な文字」を扱ってみる。 ってかただ以下なだけの話。
- XMLテキスト全体をEncodeのfrom_toを用いてeuc-jpからutf-8に変換
- 正規表現でXML宣言部のencoding="euc-jp" とあるのをencoding="utf-8" に置換
- XML::Simpleで読み込ませる
コード。
#!/usr/bin/perl use LWP::Simple; use XML::Simple; my $url = "http://hoge.hoge/kishuizon.xml"; #機種依存文字を含むeuc-jpなXML my $content = get($url); die "Couldn't get it!" unless defined $content; Encode::from_to($content, 'euc-jp', 'utf-8'); $content =~ s/<¥?xml version="1¥.0" encoding="euc-jp"/<?xml version="1¥.0" encoding="utf-8"/; my $parser = XML::Simple->new(); my $xml = $parser->XMLin($content); #以後の処理

