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