文字コードセットの判別を行うプログラムは現在のところ作っていません。その理由を解説します。
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ブラウザは、ページの伝送時に使用された文字コードセットがサーバに受け入れられるものと見なしてよいということです。ただし、そうすべきであるという意味ではありません。
文字符号化方法を指定するには、<head>-</head>間に次のように書きます。この例では文字コードセットをShift_JISとしています。
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
HTML文書の先頭に文字コードセットを指定するだけで、文字コードの判別は必要なくなるのでしょうか。Shift_JISの場合に関して、いくつかの主要なOSとWebブラウザの組み合わせで試してみました。
Windows自体が使用する文字コードセットがもともとShift_JISなので、あまり問題はなさそうです。
すべて問題ありませんでした。
Linux等UNIX系列の流れを汲むOSは、文字コードセットとしてEUCを使うことが多いので問題が起こりやすいかもしれないと思ったのですが、Webブラウザが対応していれば問題ないようです。
いずれも問題ありませんでした。
ただし、Webブラウザや選択しているフォントによっては、いわゆる半角カナを含む場合、表示時に文字化けすることがありました。フォームからの送信に関しては問題ありません。
meta要素によりShift_JISを指定した場合、これまでに調査した中ではLynxが唯一、異なる文字コードセットでフォームデータの送信を行いました。Lynxは、ブラウザの設定の"Display character set"に設定してある文字コードセットでフォームデータを送信するようです。EUCに設定されている場合にはEUCで、Shift_JISに設定されている場合にはShift_JISで送信を行います。このため、指定したものと異なる文字コードセットでフォームデータが送信される可能性があります。
しかし、今のところはプログラム側では対処を行わないことにします。これは次に述べる理由によります。
form要素にaccept-charset属性でShift_JISのみを指定して少しだけテストしてみたのですが、Lynxはこの属性を無視するようです。accept-charset属性によりサーバが受け入れる文字コードセットが指定されている場合、UAは指定された文字コードセットで送信を行うべきである(規定にはそう書いてはいないが、受け入れられなくても文句は言えない)ということだと思うのですが、私の解釈が間違っているのでしょうか。もし、私のaccept-charset属性に対する解釈が間違っている場合には、掲示板などで教えてください。
広く知られている問題として、文字コードとしてShiftJISを使用する場合、2バイト目のコードが0x5cの文字を正しく処理できない場合があります。これはエスケープに使用される文字'\'と同じコードが2バイト目に存在するためです。
具体的には、printf()関数などで文字列を表示する場合に、これらの文字があると文字化けの原因になります。
私が試した限りでは、Windows2000上(Borland C++コンパイラを使用)では問題ありません。Linux上のgccでは、unknown escape sequence: `\'というWarningが出て、実行すると文字化けが起こりました。
根本的な対策とはいえませんが、"表"や"ソ"などの2バイト目のコードが0x5cである文字を使いたい場合、"表\"のように、文字の直後に'\'を入れておくことで回避できます。
ログファイルに記録するログとその他のHTML部分の文字コードセットを同じにし、文字符号化方法を指定することで、文字コードセットの判別処理を省略することができます。現実問題としては、フォームデータが必ず指定した文字コードセットで送信されるという保証はありません。しかし、特にいわゆる半角カナを含む場合には正確に文字コードを判別することは難しく、判別処理自体が文字化けの原因になるため、どちらかといえば自前の処理で判別を行うより、Webブラウザに任せた方が良いという結論に達しました。