!!!フォームでの文字化け〜"あいうえお眉幅" さて、いきなり変なタイトルをつけてみたのですが、 理由は後で説明します。 まず以下の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のソースを眺めたときにこれらの暗号的な文字列が含まれていたら、 「あぁ、文字化け対策してるんだな」と思ってみてください。 しかし、ブラウザでは文字コード判別を 第一バイト目も見てチェックしないのだろうか・・・