PHPと機種依存文字と数値参照文字

Web屋の悩み。

一部のブラウザで表示できない文字があります。

例えば、"森鷗外"をEUC-JP環境で表示させてみます。左がFirefox、右がSafari

Safari では「鷗」が化けてしまいます。そのせいか、Safariではフォームに「森鷗外」と入力しSubmitしても必ず「森鴎外」と変換されてフォームデータが渡るようです。

自サイトの文字コードUTF-8にすればすんなり解決しますが、EUC-JPから変更できない状況では、この問題をどうにかクリアしなければならなくなります。

そのくせ、どこかのAPIを叩くなどすれば、おのずとデータにこういう文字は入ってきてしまい、正しく表示させなければ間違いとなる場合があったりするわけです。

さて、どうするか。

数値参照文字に変換させます。PHPでは mb_convert_encoding を用いて簡単に変換することができます。

print mb_convert_encoding('森鷗外', 'HTML-ENTITIES');
// 結果は '森鷗外'

(↑わ、この枠の中だとゲタに変換されてますね)

他の文字もいっしょくたに変換されてしまうため、Webページ全体をこれで変換してしまおう!というのは多少乱暴な気がしますが、どうしてもこのような「一部のブラウザで表示できない文字」を表示させる場合には有効な一手になります。

Twitter の各種APIで返ってくる値が、軒並みこの数値参照文字になっていたりしますね。

ちなみに、この変換した文字を戻すには、同じように

print mb_convert_encoding($str, 'EUC-JP', 'HTML-ENTITIES');

とすればOKです。ここで html_entity_decode を使うと、私の環境ではよく理解できないエラーを出して失敗しました。