!!!フォームでの文字化け〜"あいうえお眉幅"
さて、いきなり変なタイトルをつけてみたのですが、
理由は後で説明します。
まず以下のPHPソースを実行してみてください。
\n");
}
?>
なんの変哲もないフォームから入力された値を表示するだけの
ソースです(PHPはEUCで文字コードを扱い、上記ソースもEUCで保存されています)。
フォームの入力エリアに「文字列を表示」と入れてみます。
{{ref_image php_form_img_20051109.png}}
普通に表示されています。
次に「製造」と入れてみます。
{{ref_image php_form_img2_20051109.png}}
おや、化けてしまいました。
短い文字列を入れるとこのように化けることがあります。
これはEUCコードを使っているが為の問題なのですが、フォームで取得した
文字列が「何のエンコードが分からなくなった」のが原因のようです。
「製造」をEUCコードの16進数で表示すると、
C0 BD C2 A4
となります。
ここでおもむろにShift-JISのコード範囲を書いておきます。
Shift_JISの場合は2バイトで全角1文字となり、
第一バイト目 : 0x81 - 0x9F または 0xE0 - 0xFC
第二バイト目 : 0x40 - 0x7E または 0x80 - 0xFC
となるルールがあります。
先ほどの"製造"のEUCコードは第二バイトだけ見るとShift_JISの条件に
当てはまってしまいますね。
これだけとは限りませんが、なぜかPHPが迷って文字化けを発生させてしまうみたいです。
このShift_JISのコード範囲がキーになります。
次に謎のキーワード「あいうえお眉幅」についてです。
!!あいうえお眉幅
では、この問題を解決するには?と考えると、
「フォームからの文字列はShift_JISではない。これはEUCだ」というのを確実に教えてあげるとよい、
ということになります。
逆を返すと、Shift_JISには存在しないコードをあえて埋め込んでしまうと「EUCである」ということを主張できる、ということになります。
下記のソースを見てください。これは文字化け回避処理を入れたものです。
\n");
}
?>
フォームに渡す情報で、
のような隠し属性を入れています。
「あいうえお眉幅」、これがキーになります。
EUCコードのこの文字列を16進数で表すと、
A4 A2 A4 A4 A4 A6 A4 A8 A4 AA C8 FD C9 FD
となります。
「あいうえお」の全角それぞれの第一バイト目が「A4」となり、
これはShift_JISコードに含まれていません。
「眉幅」の全角それぞれの第一バイト目、第二バイト目共に
Shift_JISコードに含まれていないコードです。
つまり、確実に「EUCである」と判定できます。
文字化け回避のため、フォームに渡す隠し属性として「あいうえお眉幅」
を入れてあげる、というのはよく使われるみたいです。
この回避策はネットからの情報で知ったのですが、
ほか「美乳」もいいらしいです。これを16進数で表すと
C8 FE C6 FD
となり、同じくShift_JISと誤判定しないための条件がそろってます。
ただ、隠し属性で入れたとしてもHTMLソースを見ると
表示されますので、無難な文字列ということで「あいうえお眉幅」で(^_^;;。
「龠」(F3 FE)もよく使われるものみたいです。
HTMLのソースを眺めたときにこれらの暗号的な文字列が含まれていたら、
「あぁ、文字化け対策してるんだな」と思ってみてください。
しかし、ブラウザでは文字コード判別を 第一バイト目も見てチェックしないのだろうか・・・