POSTされる文字列のencoding問題

掲示板などをはじめ,フォームから日本語を入力してsubmitしてサーバ側で処理をさせるような処理を行う場合,大昔のWebブラウザは日本語化が無理矢理だったりした関係で,ブラウザによってPOSTされる文字列のencodingがまちまちだった。このため,多くのブラウザに対応するとなると,受け取る側は自動判定をはじめ小技がいろいろ必要だった。
例えば任意の文字列のEUC-JP/Shift_JISの自動判別を完全に行うことは不可能である。ここでhiddenで適当な文字列を埋め込んで,その文字列を使ってencodingを調べるといった方法もあったが,hiddenと通常の入力フォームでそれぞれ違うencodingで送るブラウザもあったり。User-Agentを見て判定の優先順位を変えるとか涙ぐましい努力をしているものもあったが,新しいブラウザがまた違うパターンだったりしてぶち壊しだったり。
最近のWebブラウザだとだいたいフォームのHTMLのcharsetと同じものを用いるので,下手に自動判定等はしない方がいいようである。
ところで,最近のWebブラウザは英語や日本語以外の多言語を取り扱うことができる。EUC-JPで書かれたHTMLのフォームにEUC-JPにはない(ASCIIにもJISX0208にもない)文字を書くとどうなるか。


実際にやってみた。
こんなformをEUC-JPで書いた。ついでにフォームのHTMLを渡す際の HTTP ヘッダの Content-Type もちゃんと”text/html; charset=euc-jp”と名乗るようにしてある。

<form action="nanika.cgi" method="post">
<textarea name="nanika"></textarea><br />
<input type="submit" name="ok" value="送信する" />
</form>

form.gif(※注: ただの画像です)
Firefox や Opera の場合

nanika=%26%2313018%3B%A4%CE%BD%F7&ok=%C1%F7%BF%AE%A4%B9%A4%EB

つまり nanika の中身は EUC-JP で

㋚の女

である。
まあ,マルサな文字が”㋚”という文字列と区別がつかないが,そもそも表現できないので仕方がない。
ところが,手元で試した中で Internet Explorer 6.0 (Windows XP) の場合だけ,

nanika=%26%2313018%3B%82%CC%8F%97&ok=%91%97%90M%82%B7%82%E9

だった。
これは

㋚の女

という文字列が送られているのは同じなのだが,Shift_JIS である。
ちなみに,EUC-JPで表現できない文字を含まない場合にはこのブラウザでもEUC-JPで送られる。
EUC-JPで表現できないからといって,Shift_JISで送るというのもおかしな話である(Shift_JISでも表現できないのだから)。コード判定でエラーになった場合にはデフォルト値にするとかいう処理があって,デフォルトがShift_JISだったとかそんな感じだろうか。
こんな現象にぶち当たった人が,仕方なく「自動判定」を入れて泥沼にはまってたりするんじゃないかと予想,というか実際にあった。
追伸:
いろいろ試していたら,フォームのHTMLに

<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />

とか書いてあると,IEで変な文字をsubmitしても,ちゃんとEUC-JPで送られる模様。HTTPヘッダは無視で meta タグは見てるってこと?