むしゃくしゃしてやった。
後悔はしていない。反省もしていない。
フロントエンドエンジニアの岡下です。
ずいぶんと前になりますが、4月23日に「クックビズ総研」という媒体をリニューアルしました。
リニューアルした際、SmartNewsでもちゃんと掲載できるようにRSSフィードのSmartNews用フォーマットを整備することになりました。
しかし、クックビズ総研のRSSは抜粋表示。SmartNews用フォーマット「SmartFormat」では全文表示が必要ですので、SmartNews専用に整備*したRSSを通常のRSSとは別に出力するよう、新たにフォーマットを作成しました。
※通常のRSSを全文表示にするだけでもいいのですが、Smartformatで表示するためのXMLタグ追加もしたので新たにフォーマットを作成した、というわけです。
そして、出来上がったRSSをふと確認してみたところ…
エラーでてるやん
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に通してみる
エラーが出ているのはわかったのですが、画像のようにエラー込みの出力フィードは改行がすべて外れて表示されているので、具体的にどの部分なのかわかりません。
とりあえずはW3Cが提供するValidatorに通してみます。
出力結果は以下のとおりです。
該当する箇所を管理画面の該当記事のTinyMCEエディタからコピーしてエディタに貼り付けると見慣れない[BS]というアイコンのような文字が…
こいつがエラーになっている原因のようです。
ここで再びフィードに表示されているエラーの内容を見てみます。
Bytes: 0x08 0xE4 0xBB 0xA5
ASCIIコード表を参照したところ、エディタで発見した文字[BS]が「0x08」であることが確定しました。
そういえば聞いたことがある。
MicrosoftのWord等からコピーすると挿入されることがあるとかないとか。
いつ、どのタイミングで挿入されてしまったのかは分かりませんが…。
ASCII制御文字を削除する処理を書く
この記事を書いている時に同じ症例が載っている記事を見つけました。
↑リンク先がいつの間にか画面真っ白になっていたので別のリンクをば。
ですが、該当文字を削除するだけというアナログな感じなので、投稿時に自動で削除する処理を作りました。
毎度エラー出して探して削除して保存し直すの面倒ですからね。
今回はfunctions.phpに以下のコードを追記しました。
記事の保存前に該当する文字列を削除する処理を書き、wp_insert_post_data
でフックします。
追記した後は管理画面から該当する投稿を更新します。
フィードを再確認する
対処後、あらためてRSS Feedを確認してみます。
エラーがなくなり正常に表示できました。
_人人人人人人人人人人人人人_
> W3Cでもエラー出てない <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
やったぜ。
最後に
処理を書いている当初はASCII制御文字のリストを正規表現で範囲指定して同じ処理を作っていたのですが、改行(0x0a)等必要なものまで消えてしまったため、エラー内容に書いている特定のASCII制御文字を配列で指定して処理を適用することをおすすめします。
また、これが絶対に正しいものであるとは限らないので、もし間違っているとかもっといい方法があるとかあれば、@gouten5010までこっそり教えて下さいね。