at posts/single.html

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.)を読むのが一番いいのかな?

書籍だとこの辺の情報も整理されているんだろうか。 今度立ち読みしてみるかな。

関連する日記