この文章をコピーしないで
↑直上の文章はなんて入力してあるか分かりますか?
ただ「この文章をコピーしないで」と入力したわけじゃありません。
試しにこの文章をコピーして、ちゃんとしたテキストエディタ(メモ帳じゃないやつ)にペーストしてみてください。
あら不思議。
ブログ上では目に見えない特殊な文字が現れましたね。
この文字のことを、正確にはエスケープシーケンスや制御コードと呼びます。
これは”文字”というより、テキストの扱い方を制御する”命令”に近く、この制御コードによって文字は動きや振る舞いを変えます。
一番よく親しんでいるのは、改行コードではないかと思います。
エンターキーによってこれを与えられると、文字は「折り返す」という振る舞いを取ります。
折り返し自体は文字ではないですが、文字に含まれる制御コードという文字によって、動きが与えられるわけですね。
さて、この制御コードが影響するのは、ブログだけでしょうか?
いいえ、ブログやホームページのようなWEBアプリからスマホアプリ、ゲームアプリ、メーラー、プリンタ、テキストエディタなど、テキストを扱うもの全般に及びます。
そしてもちろん、プログラム言語におけるテキストを扱う関数も同様です。
文字列関数を扱う際、この制御コードによってセキュリティを突かれるヌルバイト攻撃やヘッダー分割攻撃などが知られていて、開発者はその対策を考慮したコーデイングが求められています。
これは制御コードによって振る舞いを変えた文字が、文字としての意味以外を持って、プログラムに期待しない動きを与えてしまうことで、これをハッキングされることを防止するものになります。
そのため、ちゃんとしているサイトでは、文字列がバイナリで扱えないようなバイナリセーフでない関数を制御コード付のテキストが通ることで予期せぬ動きをとらないよう、ヌルバイトコードなどは共通入力処理などで一括除去などしていると思いますが、文頭の制御コードはいかがでしょうか。
このブログもそうですが、facebookなどでも除去しておらず、混入させることが可能となっています。
はい。
で、ここからが本題です。
先日facebookからブログへ記事を転送させようとして、パースエラーが発生して転送に失敗しました。
原因がなかなかつかめなかったのですが、この目に見えない制御コードが含まれていたためエラーとなっていました。
この制御コードは「ユニット区切り(US)」と呼ばれるエスケープシーケンスです。
facebookでは以前「ファイル区切り(FS)」というエスケープシーケンスも混ざってきていました。
混入工程は分かりませんが、こういう余計なものはしっかり除去しておくか、検知した時点でエラーにするのが賢明かと思います。
というわけでfacebookフィードをどこかに投稿する際に「parse error. not well formed」とか出て、文字コードに問題ない場合はこれを疑ってみてください。
除去する場合、PHPならこんなコードをいれておいた方がいいと思います。
$feed = str_replace(array(chr(28), chr(31)), '', $feed);
たぶん↓このあたりも改行コード以外は追加しておいた方がいいかもしれません。
http://e-words.jp/p/r-ascii.html
一個一個の制御コードがどんな意味を持つのか調べて個別に対策するコストを考えると、必要な制御コード以外は一律除去しておくのが現実的な落としどころではないかと。はい。
後記) facebookアプリでは文頭の制御コードはパース不能な文字としてマスク文字に置き換えられて、目に見えるようになってますね。親切。