多言語フォームのエンコーディング

質問

多言語や複数種類のスクリプトを使用するフォームにおいてエンコーディングの問題に対処する最善の方法は何ですか?

回答

(X)HTML フォームにおけるエンコーディングの問題に対処する最善の方法は、すべてのページを UTF-8 コードで記述することです。UTF-8 は、各種言語の文字を最大限に表記できます。ブラウザは、フォームを含むページと同じエンコーディングでフォームデータを返すため、ユーザーはどのようなものであれ、必要とする言語やスクリプトでデータに記述できます。 

この手法をうまく機能させるには、いくつか注意すべき細かい点があります。まず第 1 に、フォームページが UTF-8 でエンコーディングされていることをブラウザに認識させることが重要です。ページのエンコーディングについてブラウザに認識させる方法はいくつかあります。.この事は、フォームページには US-ASCII 以外のどのような文字も含まれていないものの、ユーザーが他の文字を入力する可能性がある場合に、より重要になります。

第 2 に、フォームデータを受信するスクリプトで、返されたデータが間違いなく UTF-8 で記述されているかどうかをチェックをすることも有効です (不具合が生じる例: ユーザーがエンコーディングを変更した場合).UTF-8 は他のエンコーディングにはない非常に特殊なバイト配列が含まれるため、チェックを行うことは可能です。非 UTF-8 データが受信された場合には、エラーメッセージが返されるはずです。

例えば Perl の場合、UTF-8 のテストに使う正規表現は以下のようになります。

$field =~
  /\A(
     [\x00-\x7F]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;

この正規表現は、他のプログラミング言語にも応用できます。これは、あまりにも長い不正なエンコーディングやサロゲートの不正使用といった、様々な問題に対応します。$field が UTF-8 であれば真を返し、それ以外の場合には偽を返します。

The above regular expression can be tailored by adding application-related restrictions. As an example, many control characters can be excluded by replacing [\x00-\x7F] with [\x09\x0A\x0D\x20-\x7E]