平たく言うと文字化けでBioPerl(っちゅうか、XML::Parser)がコケる・解決編

2010-03-04 - chalk-less::weblog::theclaで書いたとおり、

Unit de Recherches sur le Dvelopement Normal et Pathologi
que de Systme Immunitaire INSERM U429 Paris, France.

ってのがMEDLINEに出てきて、この、 = é のせいで、BioPerlのBio::Biblio::IO、っちゅうか、中で使っているXML::Parserが以下のエラーを出してコケる。

not well-formed (invalid token) at line 43, column 29, byte 3156 at /opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/XML/Parser.pm line 187

とりあえず、このフランス語をどうするか、ということで、「フランス語 Perl 文字化け」とかでググったら、http://www.biwa.ne.jp/~lagoinst/natsume/info/pdf/StringProcessingWithPerl.pdfってPDFがヒットした。ようするに、iso-8859-1をエンコードとして指定すればいいらしい。iso-8859-1には、ドイツ語、スペイン語も含まれている(=処理可能)とある(英語も入っている)。で、どうやってこの情報を渡すかなのだが、XML::Parserのソースを眺めていたらば、以下の記述が。

Expat has built-in encodings for: "UTF-8", "ISO-8859-1", "UTF-16", and
"US-ASCII". Encodings are set either through the XML declaration encod‐
ing attribute or through the ProtocolEncoding option to XML::Parser or
XML::Parser::Expat.

ようするに、XMLファイルのencodingの宣言を見る、それか指定しろ、ということと判断。
MEDLINE XMLの宣言はどうなっているか見てみると

<?xml version="1.0"?>

で、ようするに宣言していなかった。
Data::Dumper でBIo::Biblio::IOのつくるオブジェクトの中身を見たものの、どうやってencoding情報をXML::Parserに渡すかわからず。
ということで、XMLを書き換えて、encodingの宣言をしてしまうことに。

<?xml version="1.0"?>

<?xml version="1.0" encoding="iso-8859-1"?>

これを処理させたらば、うまく行きました。