PR

文字コード情報を無視するサーバー

 では,なぜWebブラウザは受信したデータの文字コード判別を間違ってしまうのだろうか。これを解くカギは,どうやってWebブラウザが受信データの文字コードを判別しているのか,という点にある。そこで,もう一度,WebサーバーとWebブラウザのやりとりを,さらに詳しく見ていこう。

図2 WebブラウザとWebサーバーは文字コードの情報をやりとりする
クライアントは,Webブラウザで使える文字コード情報をリクエストに入れて送り出す。サーバーはレスポンスを返信するが,クライアントから受け取った情報は通常利用しない。あらかじめ設定した文字コードの情報を送り返す。
 まずWebブラウザは,HTTPのリクエストを,Webサーバーに送信する(図2[拡大表示])。この中にはさまざま情報が詰まっている。要求の種類を表すコマンド,HTTPのバージョン,利用者名,Webブラウザの種類やバージョンなどである。文字コードの情報もここに含まれる。Webブラウザは,リクエストのヘッダー部分に,文字コードの情報を詰めて,Webサーバーに自分が利用できる文字コードを知らせることができる。実際にはリクエストのヘッダー中で,「Accept-Charset: ISO-2022-JP」のようなデータを送信する。これは,「私はISO-2022-JP(JISコード)が利用できますよ」という情報をWebブラウザがWebサーバーへ伝えている。

 しかしHTTPの仕様では,こうしたヘッダー部分の記述をオプション扱いにしている。つまり,ヘッダー部分に文字コード情報を埋め込むかどうかはWebブラウザの勝手なのである。このためか,Webサーバー側では通常こうした情報をほとんど利用しない。代表的なWebサーバー・ソフトのApache(アパッチ)やInternet Information Services(IIS)でも,通常はブラウザからのリクエストのヘッダー情報を無視している。そして,要求されたデータを単に返信しているのである。

 つまり,Webブラウザがどれだけ細かな情報を指定してリクエストを送っても,Webサーバーはあらかじめ用意してあるHTMLデータしか返信してくれない。

 一方,Webサーバーが返信するレスポンスにも,いろいろな情報が入っている。ヘッダー部には,プロトコルのバージョン,正常に処理できたかどうかを知らせるステータス・コードのほか,文字コードの情報も入れられる。例えば,「Content-Type: text/html; charset=UTF-8」のような指定があれば,「送信データはHTML形式のテキスト・データで,文字は日本語EUCを使ってビット列にしました」とWebサーバーがWebブラウザへ知らせているのである。

 ただ,これらのヘッダー情報もオプション扱いであり,Webサーバーによっては添付してこないこともある。そのうえ,ApacheやIISなどのWebサーバーは,あらかじめサーバー管理者が設定しておいた(あるいはデフォルトの)ヘッダー情報を返信するだけである。実際のHTMLデータはJISコードで記述されているのに,ヘッダー情報には日本語EUCであるといったレスポンスが返ってくることもある。