Safari での Ajax 文字化け対応
2006-11-21
先日設置したチャットが Safari で文字化けしてた(らしい)。 結論としては、 HTTP レスポンスの Content-Type を変えたら文字化けしなくなった(らしい)。
文字化けする場合
$ wget -S --spider http://www.machu.jp/sample/petachat/tmp/messages.json
--23:52:01-- http://www.machu.jp/sample/petachat/tmp/messages.json
=> `messages.json'
Resolving www.machu.jp... done.
Connecting to www.machu.jp[202.181.97.46]:80... connected.
HTTP request sent, awaiting response...
1 HTTP/1.1 200 OK
2 Date: Tue, 21 Nov 2006 14:52:01 GMT
3 Server: Apache/1.3.37 (Unix)
4 Last-Modified: Tue, 21 Nov 2006 13:45:32 GMT
5 ETag: "81987d-e67-456302fc"
6 Accept-Ranges: bytes
7 Content-Length: 3687
8 Keep-Alive: timeout=3, max=8
9 Connection: Keep-Alive
10 Content-Type: text/plain
200 OK
文字化けしない場合
--23:52:11-- http://www.machu.jp/sample/petachat/tmp/messages.json
=> `messages.json'
Resolving www.machu.jp... done.
Connecting to www.machu.jp[202.181.97.46]:80... connected.
HTTP request sent, awaiting response...
1 HTTP/1.1 200 OK
2 Date: Tue, 21 Nov 2006 14:52:11 GMT
3 Server: Apache/1.3.37 (Unix)
4 Last-Modified: Tue, 21 Nov 2006 13:45:32 GMT
5 ETag: "81987d-e67-456302fc"
6 Accept-Ranges: bytes
7 Content-Length: 3687
8 Keep-Alive: timeout=3, max=8
9 Connection: Keep-Alive
10 Content-Type: application/x-javascript; charset=utf-8
200 OK
Content-Type が「text/plain」だと文字化けして、「application/x-javascript; charset=utf-8」だと文字化けしない(JSON ファイルの文字コードは当然 UTF-8)。
そんなわけで、 Apache の .htaccess で Content-Type を指定するようにした。
<Files *.json>
ForceType "application/x-javascript; charset=UTF-8"
</Files>
でも、これで本当にいいのか自信がない。 手元に Safari が無いから、自分で確かめられないってのもあるけど(Mac欲しい!)、まとまった情報が Web に少ないようにも思える。 昔は受信した文字列をdecodeURI()関数でデコードする方法を使っていたけど、そんな面倒なことをしなくても、HTTP ヘッダの Content-Type で文字コードを指定してやればよいらしい。 かと思うと、HTTPのContent-Typeヘッダのcharsetの値は、指定しても無視されるみたい → BOM付きUTF-8にするっていう Tips のまとめページもある。 SafariでAJAX - Scriptエレメントとして読み込むjavascriptソースは、charsetをヘッダで指定した場合でも文字化けする (iandeth.)を読むのが一番いいのかな?
書籍だとこの辺の情報も整理されているんだろうか。 今度立ち読みしてみるかな。