久しぶりにXML::Parserを使ってみた。いつもは面倒なのでXML::Parser::Liteで逃げるのだが、今日は気が向いたので真っ向から対決。
UTF8フラグがONかはutf8::is_utf8を使うのが定石だが、perl5.6.xな環境ではこいつはない。ので、Devel::PeekをuseしてDump関数を利用するのが正解。
この方法でXML::Parserからの戻り値にUTF8フラグが立ってるのを確認したので、これをオフに変換。perl5.6.X系でこれをやるにはpack関数を使う。フォーマットとしてC0を与えると、バイト列としてpackしてくれる。
$str = pack('C0A*', $str);
ちなみに、この変換はURLのように明らかに2Byte文字を含まない項目にも必要だ。中身はASCIIでもUTF8フラグは立つので、他のバイト列で扱われている文字列と混在させた時に面倒なことになるからだ。
余談だが、本来論としては扱う文字列を全てUTF8文字列にアップグレードすべきなのだが、5.6.X系ではそこまでUTF8文字列を扱う環境が充実していないので、全てをバイト列に戻す対応の方が安全だと思う。