直前のエントリで、素晴らしく文字コードの混在した糞XMLファイルを得るところまでは行った訳だが、ふと思ったのだ。
こいつを無理矢理文字コード統一すりゃいいんじゃ?
つーことで、Perl5.8の出番である。ネイティブでUCS対応であり、Encode.pmも割と安定している様子でもある。
ただ、EUCとUTF-8の区別は元々難しそうな気もする。短い文字列では特に。Encode.pmが手抜きコードでないことを祈る。まあ、日本人も関わりまくってるだろうから平気かなあ。どうだろうなあ。
ともあれ、書いてみる。Encode.pm側で文字コードを決めきれない時はエラー終了するようにしておこう。
use strict; use utf8; use Encode; use Encode::Guess qw( euc-jp ); use FileHandle; my $target = 'wordpress.2008-01-02.xml'; my $in = new FileHandle $target; binmode $in; my $out = new FileHandle ">out.xml"; binmode $out; while ( defined ( $_ = <$in> ) ) { my $decoder = Encode::Guess->guess( $_ ); ref $decoder or die "Can't guess at line $."; print $out encode( 'shift_jis', $decoder->decode( $_ ) ); } close $in; close $out;
こんなもんか。超俺専用のその場書き捨てコードだな。でもまーファイルネームのとこだけ書き換えればみんなで使い回せるね!(使わない)
つーか思いっきり行単位で処理してるけど大丈夫かなあ(笑)。
まあ、万が一漏れがあったら、バックアップから手作業で直すか。もうマジめんどくせーし(笑)。
何気に出力をShift_JISにしているが、UTF-8に直接出すと波形ダッシュ問題に引っ掛かる可能性が出てくる為である。本当はbinmodeで$outのencodingをどうこうなんじゃないかとか思ったが調べるのめんどいので。
で、Encode::Guessをutf-8とeuc-jpだけに限定したお陰か、全て迷わず判別してくれたようだ。信じていいのかは知らないが。
つーことで、仕上げにローカルのテキストエディタでXMLファイルを丸ごとUTF-8に変換してから、真っ新のWordPress日本語版(MEでなく本家側にいつの間にかあった)の環境を鯖上に構築し、インポートしてみる。成功。おおおおお。
その後、ちょこちょこ弄ったけど問題無さそうなので、公開してみる。
何か問題が出ていたら突っ込みをお願いしたく。
なお、海外のテーマが壊れる問題は無くなったし、ダッシュボードがまともに表示されない問題も解決した。めでたし。