Trimでも消えないスペースって? 文字コードC2A0

cannot-remove-space-using-php-trimmeta descriptionの出力の際に、「phpのTrim関数で消えない半角スペース」があって、ハマったのでご紹介します。

そもそもTrim関数というのは、文字列の両端の通常の半角スペース(0x20)、タブ(0x09)、リターン(0x0A)、改行(0x0D)、NULバイト(0x00)、垂直タブ(0x0B)を消してくれる関数なのですが、「WordPress SEO対策 All in One SEO Packのdescription出力の改造」の際に、いくらやってもTrim関数で両端の半角スペースが消えてくれません。最初は、わたしのコーディングミスと思っていろいろやってたのですが、よくわかりません。

そこで、その半角スペースをbin2hexで16進数に変換にしたところ・・・

「C2A0」

と出て来ました。あれれ? 「20」じゃないの?

_

どうやら、文字コードC2A0とは、「UTF-8の半角スペース」というか、HTMLでいう「 」スペースのバイナリで、「そこでは改行しないスペース」という意味をもった、通常の半角スペース(20)とは全く別のスペースのようです。

このスペースが何かしらのpluginに含まれて出力されていて、これがTrim関数で消えなかったという、わかってしまえば何だよという内容でした。

$description = str_replace( "\xc2\xa0", " ", $description );
$description = trim( preg_replace( '/[\n\r\t ]+/', ' ', $description), ' ' );

文字コードC2A0を通常の半角スペース(20)に置換してしまえば、OKでした。

もし、「文字コードC2A0」がfloatしている箇所で出力されていたら、cssで横並びのレイアウトが段落ちしたりするかもです。htmlソースを見ただけでは、発見しにくいのですが、皆さんもお気をつけください。

参考サイト

http://blog.livedoor.jp/qoozy/archives/52452315.html

http://blog.fenrir-inc.com/jp/2011/06/post_51.html

余談ですが、句点は「。」(全角句点)しかないと思ってましたが、「WordPress SEO対策 All in One SEO Packのdescription出力の改造」の際に、mb_strrposで絶対にHitしない句点があって、上記と同様にbin2hexすると、半角句点というのがあることを知らされました。下記のコードのとおり、強引にmb_convert_kanaで全角句点に変換し、処理しました。上記の記事と同様、無知でした。

$description = mb_convert_kana($description,'sKV','UTF-8');
$description = mb_substr( $description, 0, 120, 'UTF-8' );
$_find_pos = mb_strrpos($description,'。',0,'UTF-8');