simplexml_load_string()関数で、


http://b.hatena.ne.jp/keyword/%E6%A5%AD%E7%95%8C?mode=rss&sort=count

こちらのrssを取得してパースし、オブジェクトに入れています。

ところが

Entity: line 499: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xE3 0x2E 0x2E 0x2E in

というようなエラーが発生します。
web上ではエラーで表示されませんが、テキストで保存してみると、
最後のエヴァンゲリオンのrss部分の

動き.

という場所があります。
それをpreg_replaceで""(なにもなし)へ置換しました。
すると、問題なく表示できました。

http://q.hatena.ne.jp/1180553984
こちらの件もあり、RSSのパース処理で
毎回エラー文字が出るたびにその部分を修正するのは、現実的ではない気がします。
(無限にこういう文字がありそうだし、
 毎回修正していてはエラーばかり表示されるので・・・)


RSSを取得してパースし、後はレイアウトとか調整して出力しているだけです。

こういう場合、どのようにすればいいのでしょうか?
XMLを甘く見ていました・・・。

回答の条件
  • 1人3回まで
  • 登録:2007/05/31 11:24:11
  • 終了:2007/06/02 15:39:46

ベストアンサー

id:tezcello No.1

tezcello回答回数459ベストアンサー獲得回数692007/05/31 13:12:31

ポイント100pt

こんな記事がありましたが、参考になるでしょうか?

まだ未テストなので今回の場合も上手くいくのか分りませんが...

http://fladdict.net/blog/2006/06/rssutf8.html

id:onigirin

どうもありがとうございます。

試してみたところ、今回のエラーは解消されました!

コンバートすごいですね・・・。

ただ、

http://q.hatena.ne.jp/1180553984

こちらのエラーには反映されませんでした。

非UTF-8文字列の対処法が出来ましたが、

不正な文字はまた別のようですねぇ。

この関数はちょっとすごいと感動しました(笑)

2007/05/31 17:27:55
  • id:tezcello
    utf-8の枠内に収まっている不正な文字と言う事なのかもしれませんね。
    UTF-8 -> UTF-8 ではなく、
    UTF-8 -> SJIS -> UTF-8
    UTF-8 -> EUC -> UTF-8
    なんかで除去できませんか?
  • id:onigirin
    試してみましたが、エラーは直りませんでした。
    http://b.hatena.ne.jp/keyword/web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9?mode=rss&sort=count
    この一番下のホットペッパーの説明文の中に
    「♂」の半角文字みたいなので入ってるのが原因なんですが、
    G等で検索しても「?」になるし、謎の文字でした。

    次はどういう文字が登場してバグるのか、
    不安だけど気になるところですねぇ。
  • id:tezcello
    もしも半角カナと間違えられているのなら、半角->全角への変換を挟むとどうでしょうか?
    http://phpspot.net/php/man/php/function.mb-convert-kana.html
  • id:onigirin
    どうもありがとうございます。

    試してみたところ、特に変化はありませんでした・・・。

    RSSリーダーが沢山出てるので
    何か解決法はあるのでしょうねぇ・・・。
  • id:tezcello
    少し調べてみました。
    RSSを作るときのミスの様な気がして来ました。
    UTF-8は可変長コードなので、単純にバイト数では文字列を切れませんが、それをやってしまったおかげで要約の省略付近でおかしな事になっているのではないかと...
    なので、この先もこんな不正文字列を含むRSSを取得してしまうハメには何度も陥ると思われます。

    解決法としては、キッチリとしたUTF-8のフィルターを自作するのがありますが...バイト列を全てに渡って検査するのはPHPでやるには荷が重い様な気がします。
    UTF-8へのエンコード変換で部分的には成功している様なので、これをすり抜けてくる不正文字がなくなる様なライブラリのアップデートを待つしかないのかも(消極的ではあるけれど)

    今気が付いたのですが、UTF-8 -> UTF16 -> UTF-8 はどうなるのでしょう?
    エラーメッセージに出ているE3 2E 2E 2E は、
    E3 に続く値は 80-BF のはずなのでチャンと解析すると不正なコードなのですが、手抜きでユニコードに変換すると、
    E3 2E 2E -> 3BAE = 㮮 となり不正なコードではなくなります。
    UTF-8 の変換が手抜きだからといって、UTF16 の変換も手抜きになっているとは限りませんが、そこで不正文字を無視してくれれば、それこそこちらの望む結果ではあるので。

    http://q.hatena.ne.jp/1180743477
    で回答すべきだったかも知れませんが、話の流れとしてこちらへ書きました。
  • id:onigirin
    どうもありがとうございます。

    UTF-8→UTF-16→UTF-8を試してみましたが、
    ♂でエラーがやはり出ました。

    ということは、はてなのWEBサービスのRSSにミスが入っている
    可能性があるのですね・・・。
    確かに、ライブドアクリップの方を使ってみると、
    エラーにまだ出会っていません。
    (エラーの出る同じサイトが出てきてないからかもしれませんが・・・)

    RSS自体も閲覧すると破壊されているものもあるので、
    一度はてなにも問い合わせてみたいと思います。

    新しくまとめて質問作ってみました。
    どうもありがとうございました。

    XML処理で頭がいっぱいいっぱいです・・・。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません