RSS の問題の原因か?

ブログ村に記事が更新されない問題、引き続き調べていたんですが、おそらくこれであろう、という原因を特定したので、記録しておきます。

o6asan さん、それを書いた本人です。ご迷惑をおかけして申し訳ありません。
Apple Safari 7.1 を使って書き込んだのですが、
どうやら Safari 7.1 のバグ(と思われる)により異常なデータが入ってしまったみたいです。
「を」と「丸」の間に(見えませんが)ASCIIコード 08 が1バイトだけ挟まっています。

>フォーラム管理者様
自分で編集も削除も不可能なため、お手数ですが対処して頂けないでしょうか。
どうぞよろしくお願い致します。

http://ja.forums.wordpress.org/topic/139490

このようなやりとりがあったのですが、要するに、Safari にバグがあり、0x08 の文字がブログの編集状態で紛れ込み、それによりよろしくない XML が生成される、その結果、ブログ村の方で parse error となって記事が更新されない、という流れのようです。

よって、全文ではなく、一部にしたことで、そういう制御文字が紛れ込むリスクが緩和され、更新されない頻度が低下した、というの現状と理解しました。

ブログ村の方も、parse error があったのなら、そう表示してくれればいいものを。

つまり、バグの原因としては、Safari が意図しない制御文字を含む記事を送信することと、そういう制御文字などが含まれることを意識しない WordPress が invalid な xml を吐くこと、2 つのバグが原因と思われます。

記事の登録の時点か、RSS を生成する前に食わせる記事のテキストを [cci_php]$s = preg_replace(‘/[\x00-\x09\x0b\x0c\x0e-\x1f\x7f]/’, ”, $s);[/cci_php] で済む問題だと思うのですが、はてさて、どこをどうすればいいのでしょうね。

WordPress 本体に手を入れるのはいかがかと思うので、そういうプラグインを探すなり、作るなりしたほうがよさ気。

あるいは、Safari 8 でバグが治っているのであれば、それはそれで放置してもいいかも。

にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしへ
にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしに参加しています。 励みになりますので、足あとがわりに、ランクアップにご協力下さい。

5 thoughts on “RSS の問題の原因か?

  1. こんばんは。初めまして。

    「ダッシュボードのRSSエラーの原因除去のお願い。」のあと,さらに https://ja.forums.wordpress.org/topic/140980 というトピックを建てました。しかし,日本語版チームの方も直接の対応ができないということなので, https://meta.trac.wordpress.org/ticket/656 という報告をしています。今のところ何ら動きはありませんが,早く直してくれないかなと思っています。

    紛れ込むのは, C0 系の制御文字のようです。フォーラムの場合, WordPress の記事自体に紛れ込んでますが,投稿の表示時点では問題が発生しないようです。 xml のパースのほうがきっちりしているのでしょうか。

    Shigematsu さんは,ご自身が Safari をお使いですか。

  2. はじめまして。
    うちの環境では、再発していませんが、Yosemite にして、Safari が 8 になったので、Safari のバグがとれたのかもしれませんし、その辺はまだわかっていません。
    今、外出中なので、別のエントリを予約にしてあるのですが、現状、preg_replace で置換するだけ(このエントリの対策)そのもののプラグインについて書いてあります。
    記憶が確かなら、今の PHP は基本 UTF-8 で、preg_replace が UTF-8 には対応していたと記憶しているので、仮に C0 とか、そういう文字を取り除きたいとしたら、正規表現に単に C0 を加えれば、RSS feed を生成する前に、食わせることで対処できると思います。
    ただし、C0 が UTF-8 の 2, 3 バイト目に含まれるってこともあるとして、そういう場合に preg_replace で対応できない(マッチしてしまう=削られる)ということがあれば、表現を変えないといけないとは思いますが。
    Unicode には詳しくないので、連休明けに戻ったら、調べてみようと思います。
    情報ありがとうございました。

  3. おはようございます。

    Mac をお使いなんですね。

    私は PHP に詳しくないので,ちょっとマニュアルを見た程度ではわからないのですが,システムが UTF-8 で動いているなら, preg_replace を使うときに, http://jp2.php.net/manual/ja/regexp.reference.unicode.php の Cc (コントロール文字) というのを生かしたらうまくいくかなと思いました。

    調べた限りでは,紛れ込んでくるのは C0 系だけのように思えましたが,ほかの場合もあるでしょうし,制御文字系はすべて排除しても問題ないでしょうから。
    C0 and C1 control codes
    http://en.wikipedia.org/wiki/C0_and_C1_control_codes#C0_.28ASCII_and_derivatives.29

  4. C0 というのは、0xc0 という意味かと思いました。
    うちでは、^H 0x08 が紛れ込みまくってました。
    自分は PHP はかれこれ 10 年まともに使っていませんので、頓珍漢なことをいってたらすみません。
    preg_replace の \p{Cc} が \n (だとか、\r)だとかにマッチするとちょっと都合が悪いかもしれません。
    今は、調べる時間が取れないので、愛媛に戻りましたら、調べてお返事いたします。

Leave a Reply