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.xmlmime-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追記。MozillaXMLHttpRequestにはoverrideMimeTypeプロパティがあって、ブラウザ側で文字コードが指定できるようです。(参考:XMLHttpRequestの文字化けにoverrideMimeType - nazonoDiary)