前のプロジェクトでは、とある業務で用いるWebアプリケーションを構築していた。このアプリケーションの引き継ぎの際、「入力のテキストボックスにハングル文字を入力した場合に、どのような振る舞いになるのか」と、たずねられたことがある*1。この質問に、即答できるだろうか*2?
まぁ即答できないまでも、テキストボックスにハングル文字を入力した場合に、どのようなリクエストが送信されるのかを試してみればすぐにわかる。
そこで、次のような簡単なHTMLファイル(test.htmlとする)を作成してみる。ちなみに、input要素のvalue属性の値“한글”が、ハングル文字“한글*3”の16進数による数値文字参照である。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-31j" /> </head> <body> <form action="http://localhost/abc"> <input type="text" name="chars" value="한글" /> <input type="submit" /> </form> </body> </html>
このHTMLをWebブラウザで見ると、次のようになる。
このようなフォームを、ハングル文字をエンコードできない文字コード(ここではWindows-31Jを用いる)と、ハングル文字をエンコードできる文字コード(ここではUTF-8を用いる)の2種類作成し、それぞれサブミットし、どのようなリクエストが送信されるのかを確認してみるだけだ。
まずは、Windows-31Jの場合のリクエストを示す。
http://localhost/abc?chars=%26%2354620%3B%26%2344544%3B
URLエンコード(パーセントエンコーディング)が少しうっとうしいかもしれないが、“%26”は“&”、“%23”は“#”、“%3B”は“;”であるので、リクエストパラメータとして、10進数の数値文字参照“한”と“글”が送信されていることがわかる。
次にUTF-8の場合のリクエストを示す。
http://localhost/abc?chars=%ED%95%9C%EA%B8%80
こちらは、(あたりまえだが)UTF-8でエンコードされた値*4が送信されている。
結論としては、「エンコードできない文字が入力された場合には、10進数の数値文字参照の文字列が送信される」となる*5。へぇ、10進数なんだ。
この値をサーバ側でどのように処理するかは、アプリケーション次第だが、“&”や“#”や半角数字なんかは、大概システムの許容文字とするだろう。となると、Windows-31Jを指定しているWebアプリケーションでは、たまたま業務仕様上の入力値チェックにひっかかるか、ユーザが意図しない値が確認画面に表示されるか、そんなところだ。
冒頭の質問の回答も、冷静になって考えればこんなもん。難しくはない。
*1:結局、何が聞きたかったのかは、わからずじまいだったが。。システム許容文字のチェックと(業務上の)入力値チェックのアーキテクチャは説明したのだが、そこではなかったようだ。
*2:新年早々に、つまらない質問ではあるが。。でも、いきなりきかれると、ちょっとびっくりするよね。
*3:意味は「ハングル」。
*4:UTF-8でURLエンコードされた値のこと。ちなみに、“한”をUTF-8でエンコードすると“0xED959C”で、“글”をUTF-8でエンコードすると“0xEAB880”。
*5:Internet Explorer 8、Mozilla Firefox 3.6、Google Chrome 8で試したが、同様の結果だった。これは、HTML4.01の仕様にあるのかな?ちょこっとだけ探してみたが、見つからなかった。。