Safari での Ajax 文字化け対応
先日設置したチャットが 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.)を読むのが一番いいのかな?
書籍だとこの辺の情報も整理されているんだろうか。 今度立ち読みしてみるかな。