Sunday, April 02, 2006

メールと Web ページの文字エンコーディング

メールでもっとも単純な場合は、メールヘッダに

Content-type: text/plain; charset=ISO-2022-JP

のようなヘッダが入る。これにより、そのメールで
使われている文字エンコーディングが判明し、
メーラはメール本文を表示することができる。



Web ページの場合、HTTP レスポンスヘッダに

Content-type: text/plain; charset=UTF-8

のようなヘッダがあれば、ブラウザはここで指定された文字エンコーディングで
ページ内容を解釈して表示する。

Web サーバは、text/plain や text/html のような MIME タイプについては、
ブラウザからリクエストされたファイルの拡張子にもとづいて判別できる。
たとえば Apache だと、mime.types ファイルで対応関係を定義している。

問題は、charset で指定される文字エンコーディングの方で、これは
Web サーバが判定するのは難しい。そこで、HTML ファイルの場合は、
meta タグによって、この問題を解決している。つまり、
HTML ドキュメントで

<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=euc-jp">
</head>

のように head セクションの最初に書く meta タグで文字エンコーディングを指定する。
ブラウザはここで指定されているエンコーディングにしたがって、ドキュメントを
解釈し、表示する。本当は、Web サーバがここを見て HTTP レスポンスヘッダを
設定してくれるのがベストだが、そこまではしてくれない。
もちろん、この手法は HTML ファイルにしか使えない便法にすぎない。

やはり、もっともよいのは HTTP のレスポンスヘッダで charset を指定してやることなのだ。
これを簡単にやる方法として、たとえば Apache だとディレクトリに
.htaccess というファイルをつくって、そこに

AddType "text/html; charset=EUC-JP" html

と書いてやると、そのディレクトリとサブディレクトリ以下に置かれた拡張子が
html のファイルの HTTP レスポンスの Content-type ヘッダの値を指定することが
できる。この方法だと、HTML 以外のファイルにも charset を指定することができる。
HTML の文字符号化スキーム を解説した文書を参考にしてくれ。


Web サーバは、
Content Negotiation
という処理をしてくれることがある。
これは HTTP/1.1 の規格で定められている。この処理は、
ブラウザからのリクエストヘッダ Accept-Language や Accept-Charset の値から
適切な言語、適切な文字エンコーディングのドキュメントを選択して
レスポンスするというものだ。たとえば、index.html として複数の
index.html.en, index.html.fr, index.html.ja.jis, index.html.ru.cp-1251
等々を用意しておき、リクエストヘッダを使って Content Negotiation して
適切なファイルをレスポンスする。この場合は、HTTP レスポンスヘッダに
文字エンコーディングが入ることもあるだろう。

No comments: