Shift_JIS に無い文字をフォーム送信時にブラウザがエンティティ変換してしまうのかのまとめ


Shift_JIS には無かった漢字は、昨今、文字コードがUTF-8 であればそのまま打ち込んだ文字でもブラウザで表示可能になった。また、数値文字参照(〹 の形式)であれば、Shift_JIS および EUC-JPページ内でも表示可能(※)。

※見る側の環境に、それらの漢字を含むメイリオなどの新しいフォントは必要。

が、Webサイト制作者が用意するページではなく、CMSやメールフォームなどが Shift_JIS だった場合、フォーム送信時にそれらの漢字がどうなるかをまとめ。
(ちなみに最初にフォームを送信する時はブラウザでこれらの特殊文字でも正常に表示される。)

フォーム送信時に数値文字参照に変換

ブラウザによっては、フォームの文字コードに無い文字はフォーム送信時に数値文字参照に勝手に変換してから送信する。これを行うブラウザは調査した限りでは下記の通り。
また、変換を行わないブラウザは、ページの文字コード体系に含まれない漢字でも復元表示してくれる。

ブラウザ フォーム送信時 読み取り
数値参照に変換 変換なし 数値参照 生文字コード
Win FireFox 7 OK OK
Win IE9 OK NG
Win Safari 5 OK NG
Win Chrome 15 OK OK
Win Opera 11 OK OK

開発の際の方針

Web制作の場合はブラウザの限定はできないので、真面目にやるなら以下のように対応するのが吉か。

フォーム受け入れ口

エンティティ(何らかの形式の参照)か生文字コードどちらかを判別して、保存前にどちらかに統一する。保存したデータを後でただ表示するだけならエンティティに統一する方が楽だが、検索対象などとして使う場合は、全体を UTF-8 変換した上で生文字コードで保存した方がよい。(そうしないと、検索や文字列を切り出すときにいちいちエンティティなのかただの英数字の羅列なのかを判別しなければならない。)

データ表示時

数値文字参照(エンティティ)に変換して表示する。