2017年10月17日(火) 18:47 JST

RSS Aggregator改造版(その2)

  • 投稿者:
  • 表示回数 4,580
Geeklog

RSS Aggregator改造版がGeeklog.jpで動作しない理由がやっと判明した。PHPのxml_parser_create()関数が受け付けるエンコーディングはUTF-8, ISO-8859-1, US-ASCIIの3種類なので,日本語を含むxmlファイルを処理するには,必然的にUTF-8を指定することになる。PHPのバージョンにかかわらず,ソースエンコーディングをUTF-8にするためには,xml_parser_create( 'UTF-8' );とすればよい。

あとはUTF-8以外のフィード(EUC-JPなど)をxml_parse()に喰わせる前に,encoding='foo'を含めてUTF-8に変換してやればよい。この方針で行けば,mb_detect_encoding()などの確実性に欠ける関数を使わなくても済む。

というところまではすぐに思いついたが,PHP4だと文字化けする。フィードデータはまちがいなくUTF-8で与えているのに,どうもxml_parse()がISO-8859-1と決めつけている節がある。なぜ...

ふと,英語版のPHPマニュアルを見ていると,xml_parser_create()のノートにこんなコメントが載っていた。

[quote]

php at stock-consulting dot com (21-Feb-2005 10:47)

Even though I passed "UTF-8" as encoding type PHP (Version 4.3.3) did *not* treat the input file as UTF-8. The input file was missing the BOM header bytes (which may indeed be omitted, according to RFC3629...but things are a bit unclear there. The RFC seems to make mere recommendations concering the BOM header). If you want to sure that PHP treats an UTF-8 encoded file correctly, make sure that it begins with the corresponding 3 byte BOM header (0xEF 0xBB 0xBF)

[/quote]

このメモによると,どうもこの関数は好みがうるさく,PHP4を使ってUTF-8でデータを与えるときにはBOMをつけないとだめなようだ。これをヒントに,フィードデータをUTF-8に変換した後,BOMをつけてからパーサに読み込ませるとあっさり動作する。orz

PHPはマニュアルが充実しているのが長所の1つだが,マニュアル化されていない地雷も数多くある。そういう意味で,マニュアルに付属しているUser contributed notesは貴重な資料であることは間違いない。

これで安心したのも束の間,今度はGeeklog.jpの掲示板のフィードデータをいつのまにか読み込まなくなった。PHP5でも同様。FEED Validatorにかけてみると,不正な文字が含まれているせいでxmlパーサがエラーを起こしている。こういう状況だから,フィードデータを読み込めないのはある意味しかたないと思うが,FirefoxのSageはそんな逆境にもめげずにきちんと読み込んで動作する。

まだまだ修行が足りないようだ。xml_parse()関数を使いながら,エラーをリカバーする方法があるのかもしれないし,だめならxml_parse()系の関数に頼らず自力でパーサーもどきを書く必要があるのかもしれない。SimpleXMLやDOMを使えば簡単だが,PHP4でも動作させるとなるとその方法も採れない。先は長そうだ...

タグ:rss rss_aggregator xml_parse