以前書いた記事にもありましたが、
MTを4.1から4.25にしたら一部のプラグインがすんげえ文字化けする。
具体的に言うと、ひとつは自分で作って1人で使っている指定したRSSを取得して、
そのRSSの中身をダッシュボードに表示するもの。
もうひとつは、HatenaBookmarkWidget Modified
どちらも、RSSを取得して、そこに書かれたXMLの構造をXML::Simpleで解析し、
プラグインの変数化してダッシュボード上に表示するもの。
いまだにはっきりした原因・改善策はわからない。
指定したRSSを取得するプラグインの方はXML::Simpleを使うのをやめて、
XML::DOMでパースして、独自に抽出する方法を使ったら、
何とか回避できた。
回避といっても、取得するRSSの文字コードを一旦utf-8に変換し、
それをXML::DOMに喰わせて、
ハッシュに登録するときにutf8::encode($var)のようにutf8フラグを
ちまちまと一個一個落として、登録するという風にした。
以下のページを参考にさせていただいた。
[perlメモ]さくらインターネットのレンタルサーバーでeucのXMLファイルをXMLinで解析しようとするとParser.pmがエラーを吐く件について - KUMA TYPE
DOMでgetElementsByTagNameとかgetFirstChildとかしながら、
目的の変数を探さなきゃいけないのでいくらかめんどい。
そんで少しはわかったことは、これはおそらくXML::Simpleの問題だろうと
いうことである。
XML::Simpleの文字化け問題はすこしググればすぐに大量にでてくる。
XML::Simpleを使うとき、デフォルトでどのパーサを使うかが問題なのだとか、
なんとかというパーサはUTF8のファイルしか受け付けないのだとか。
延々数時間そういう情報を読んでみたが、結局わからなかった。
UTF8て何?フラグって何?バイト列って何?
いや、まあ、なんとなくはわかるけど、でも何なの?
という状態なので、自分の環境がどんな状態にあって、
何が原因なのかを突き止めることができなかった。
今回、やっと「utf8::encode($var)」とか「Encode::decode('utf-8', $xml)」という
コードを書いていくらかその感触をつかめたけれど、
やはり理解はまだまだできていないと思う。
ここはひとつ、小飼弾先生に根掘り葉掘りご教授いただけたら嬉しいのだが、
一方的に(ブログ上で)面識があるだけなので
そんなことが望めるはずもなく。
以下、備忘録としてのリンク。
perl - 勝手に添削 - WEB+DB Press Vol.32 pp.94 - 404 Blog Not Found
encode_utf8ってメソッドを使うのか?
perl:標準Moduleで漢字変換 - Monpe's Room
で、MTを4.1から4.25にしたら文字化けするようになったと書いたけど、
そこらへんもなんかあやしいかもしれない。
確かに、MT4.1とMT4.25のextlibの中身を比較すると、
「extlib/XML」以下のファイルがいくつか更新日時が違っており、
ここら辺が変化していることがわかる。
でも、ふとログをみると以下のようなエラーがでている。
shinichiのtwitter_favoritesストリーム(twitterタイプのmelonsode)の更新に失敗しました:
error in processing external entity reference at line 1, column 109, byte 109: &<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd">
============================================================================================================^
<!-- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -->
at /usr/local/lib/perl5/site_perl/5.8.9/mach/XML/Parser.pm line 187
何これ?
usr/local/lib/perl5/site_perl/5.8.9/mach/XML/Parser.pm line 187
で、ググってみると、上記のリンク([perlメモ]さくらインターネット....)が出てくる。
これはMTのバージョンの問題ではなく、
さくらインターネットのサーバの設定が変わったせいなのか?
と思ってしまう。
ともかく、未だによくわからない状態であります。
時間ができたら、HatenaBookmarkWidgetもXML::DOMでコーディングし直そうかな・・・。
ちなみに、以下のような文字化け。
utf8::encode($var)としたら、以前は麻雀牌のような時に文字化けしたのだけど、
これをすると、また違った文字化けの仕方になる。
しかも不思議なのは、最初の方は文字化けしなくて、途中から文字化けがはじまる点。
一応、文字化け問題は解決してないけど、
現時点での最新のHatenaBookmarkWidgetを晒しておきます。