XMLHttpRequestのresponseTextで扱える文字コードについて
よく分かっていない部分もありますが、備忘録としてメモします。
XMLHttpRequestオブジェクトのresponseTextプロパティは、(ほとんどのブラウザで)デフォルトでは文字コードUTF-8とみなされます。が、ブラウザよって違いはありますが、他の文字コード(shift_jis, EUC-JP等)を扱うこともできます。この点については以下が詳しいです。
http://jsgt.org/mt/archives/01/001221.html?1155011082951
(2006/08/09追記。初歩的な質問をコメントさせていただいたのですが、お答えいただきました。感謝。)
ただ、ローカルで試すと文字化けしました。これはブラウザが、データのヘッダ情報により文字コードを判断しているためではないかと思います。(Webサーバ経由でない)ローカルファイルだとヘッダ情報はつけられませんので、UTF-8でないと文字化けするのではないかと。
以下の例は以前prototype.js解読で使用した例とほぼ同じです。違いはサーバ側のJSPでヘッダ情報の文字コードをshift_jisと指定している点です。(JSPファイルももちろんshift_jis)
[test.htm] <html> <head> <title></title> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <script language="javascript" src="./prototype.js" charset="utf-8"></script> <script language="javascript"> function test(){ new Ajax.Request( 'test.jsp', { method: 'get', onComplete:function(req){ $('test').innerHTML += req.responseText + ":" + Ajax.activeRequestCount; } }); } </script> </head> <body> <div id="test"></div> <button onclick="test();test();">TEST</button> </body> </html>
[test.jsp]shift_jisで記述する。 <%@ page contentType="text/plain;charset=shift_jis" %> <%@ page import="java.util.*, java.io.*" %> <% //キャッシュ無効化 Calendar today = new GregorianCalendar(); response.setDateHeader("Last-Modified", today.getTime().getTime()); response.setDateHeader("Expires", 0); response.setHeader("Pragma","no-cache"); response.setHeader("Cache-Control","no-cache"); Thread.sleep(2000); %> Ajax(XMLHttpRequest)のテスト
test.htmの文字コードはUTF-8ですが、問題なく表示されます(IE6で確認)。この場合、データの文字コード(test.jspが実際に記述されているコード)とヘッダの文字コード情報(pageディレクティブのcontentType)が一致していればいいようです。
プレーンテキストをそのまま(test.txt等)を扱いたい場合は、Webサーバでヘッダ情報を付与します。私の環境(WinXP+Apache+Tomcat)ではweb.xmlのmime-mapping要素で指定しました。(2006/08/09 追記。すみません、Apacheは入れてませんでした。Apacheがあればhttpd.confでの設定も可能です。)
[web.xml] <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <mime-mapping> <extension>txt</extension> <mime-type>text/plain;charset=shift_jis</mime-type> </mime-mapping> </web-app>
もっといい方法があるかもしれませんが・・・。
2006/08/09追記。似た質問が、はてなに投稿されました。
人力検索はてな - Ajaxと文字コードの関係について。
2006/08/21追記。MozillaのXMLHttpRequestにはoverrideMimeTypeプロパティがあって、ブラウザ側で文字コードが指定できるようです。(参考:XMLHttpRequestの文字化けにoverrideMimeType - nazonoDiary)