最近朝起きて Podcast を同期しても深夜アニメが転送されません。シリーズ予約していたタイトルも続々と最終回を迎えた結果 ほとんど録画されないようになったのねー。と思っていたのですが、よく調べたら
自動エンコードスクリプトがエラーで止まってました
いやはや(笑)。で原因は、自宅サーバ復活の前に思い切って PHP4 から PHP5 に上げた弊害。というか、PHP4でXML読み込みに使っていた XML 関連の関数がPHP5では互換性の無い別のものに変わっていたので関数が見つからないとか言って機能してませんでした。
ということで、よく考えたら PHP5 にしたのは PHP5でないと使えない SimpleXML というのを使ってみたかったからという理由もあるので、練習に書き換えてみました。
$dom = domxml_open_file("$path/$gno");
$root = $dom->document_element();
foreach ($root->child_nodes() as $foo) {
switch ($foo->tagname) {
case "Contents":
foreach ($foo->child_nodes() as $bar) {
if ($bar->tagname == "title") $title=mb_convert_encoding($bar->get_content(),"EUC-JP","UTF-8");
if ($bar->tagname == "supplement") $desc=mb_convert_encoding($bar->get_content(),"EUC-JP","UTF-8");
}
break;
case "Program":
foreach ($foo->child_nodes() as $bar) {
switch ($bar->tagname) {
case "start_date":
$date=$bar->get_content();
break;
case "start_time":
$time=$bar->get_content();
break;
}
}
break;
}
}
$s = preg_replace('/encoding="Shift_JIS"/','',`nkf -Sw8 '$path/$gno'`);
$xml = simplexml_load_string($s);
$title = mb_convert_encoding($xml->Contents->title,"EUC-JP",'utf-8');
$desc = mb_convert_encoding($xml->Contents->supplement,"EUC-JP",'utf-8');
$date = $xml->Program->start_date;
$time = $xml->Program->start_time;
あわあわ、ホントにシンプルですな。入力に関しては事実上 UTF8 しか受け付けない上に encoding= に UTF8以外が入ってると誤動作するのが曲者ですが、はじめにおまじないをしてあげれば後はらくちんです。
こんなに簡単だったら自動エンコードスクリプトを書く前にPHP5にすれば良かったですね(笑)。