HTMLのフォームタグから送られてくる文字列の文字コードについて

metaタグで指定されている文字コードで送るのが慣例らしい。

meta要素を用いて文字符号化方法を指定することで、HTML文書に使用する文字コードセットを指定することができます。Webブラウザが文字列をフォームから送信する場合、指定された文字コードセットで送信することが慣例となっているようです。これは、HTML 4.01でform要素に規定されているaccept-charset属性に関する以下の記述によります。

The default value for this attribute is the reserved string "UNKNOWN". User agents may interpret this value as the character encoding that was used to transmit the document containing this FORM element.

日本語訳もあります。つまり、accept-charset属性が指定されていない場合、Webブラウザは、ページの伝送時に使用された文字コードセットがサーバに受け入れられるものと見なしてよいということです。ただし、そうすべきであるという意味ではありません。

ブラウザからWebサーバーへデータを送信する場合、HTML文書 に FORMタグ を入れておき、GETメソッドかPOSTメソッドを使い送信します。この際に使用する文字エンコーディングは、FORMタグ の accept-charset属性 で指定することができます。以下のように指定します。

〜中略〜

しかし、世の中には、accept-charset属性 を無視して、常に同じ文字エンコーディングでデータを送信したり、受け取った HTML文書 と同じエンコーディングで送信したりするブラウザが少からず存在するようです。

  • 携帯電話ブラウザの多くは、常にSHIFT-JISで送信します。
  • 古いブラウザは、accept-charset属性 を無視するものが多いようです。

(詳細には確認していません。少しケースは違いますが、accept-charsetが無い場合についての調査結果が CGIと漢字コード のページに掲載されています。)
結局、ブラウザがどのような文字エンコーディングでデータを送信してくるかは、サーバーで受け取ったデータから判定しているケースがほとんどのようです。

Macネットスケープ4.7では、直前に訪問したホームページの文字コードをそのまま引きずってしまうというバグがあります。

文字コードの違いを利用した各種攻撃がありえるので、サーバ側で必ず入力文字列を安全に処理する必要がある。