うちのWordPressのRSSフィードでエラーが出るのはどう考えてもASCII制御文字が悪い!

投稿者: | 2015年8月6日

むしゃくしゃしてやった。
後悔はしていない。反省もしていない。

フロントエンドエンジニアの岡下です。
ずいぶんと前になりますが、4月23日に「クックビズ総研」という媒体をリニューアルしました。

リニューアルした際、SmartNewsでもちゃんと掲載できるようにRSSフィードのSmartNews用フォーマットを整備することになりました。
しかし、クックビズ総研のRSSは抜粋表示。SmartNews用フォーマット「SmartFormat」では全文表示が必要ですので、SmartNews専用に整備*したRSSを通常のRSSとは別に出力するよう、新たにフォーマットを作成しました。
※通常のRSSを全文表示にするだけでもいいのですが、Smartformatで表示するためのXMLタグ追加もしたので新たにフォーマットを作成した、というわけです。

そして、出来上がったRSSをふと確認してみたところ…

wp-feed-error

エラーでてるやん

error on line 2354 at column 197: Input is not proper UTF-8, indicate encoding !
Bytes: 0x08 0xE4 0xBB 0xA5

_人人人人人人人人人人_
> エラーでてるやん <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

意訳:2354行目の197文字目がUTF-8として正しくエンコード出来ないんやで。ちゃんと指定しなされ。

…というわけで対処をしたその方法を書き留めておきます。

Validatorに通してみる

エラーが出ているのはわかったのですが、画像のようにエラー込みの出力フィードは改行がすべて外れて表示されているので、具体的にどの部分なのかわかりません。

wp-feed-error-large

とりあえずはW3Cが提供するValidatorに通してみます。

W3C Feed Validation Service

出力結果は以下のとおりです。

w3c-feed-validator-error

該当する箇所を管理画面の該当記事のTinyMCEエディタからコピーしてエディタに貼り付けると見慣れない[BS]というアイコンのような文字が…

ascii-code-0x08-bs

こいつがエラーになっている原因のようです。

ここで再びフィードに表示されているエラーの内容を見てみます。

Bytes: 0x08 0xE4 0xBB 0xA5

ASCIIコード表を参照したところ、エディタで発見した文字[BS]が「0x08」であることが確定しました。

そういえば聞いたことがある。
MicrosoftのWord等からコピーすると挿入されることがあるとかないとか。
いつ、どのタイミングで挿入されてしまったのかは分かりませんが…。

ASCII制御文字を削除する処理を書く

この記事を書いている時に同じ症例が載っている記事を見つけました。

【WordPress】WordPressの記事内にASCII制御文字が入っているとRSSフィードがエラーになる

↑リンク先がいつの間にか画面真っ白になっていたので別のリンクをば。

WordPressのRSSフィードエラーは制御文字が原因?

ですが、該当文字を削除するだけというアナログな感じなので、投稿時に自動で削除する処理を作りました。
毎度エラー出して探して削除して保存し直すの面倒ですからね。

今回はfunctions.phpに以下のコードを追記しました。

記事の保存前に該当する文字列を削除する処理を書き、wp_insert_post_dataでフックします。

追記した後は管理画面から該当する投稿を更新します。

フィードを再確認する

対処後、あらためてRSS Feedを確認してみます。

wp-feed-success

エラーがなくなり正常に表示できました。

w3c-feed-validator-success

_人人人人人人人人人人人人人_
> W3Cでもエラー出てない <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

やったぜ。

最後に

処理を書いている当初はASCII制御文字のリストを正規表現で範囲指定して同じ処理を作っていたのですが、改行(0x0a)等必要なものまで消えてしまったため、エラー内容に書いている特定のASCII制御文字を配列で指定して処理を適用することをおすすめします。

また、これが絶対に正しいものであるとは限らないので、もし間違っているとかもっといい方法があるとかあれば、@gouten5010までこっそり教えて下さいね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Calculate it, plz.(captcha) * Time limit is exhausted. Please reload CAPTCHA.