kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

Ajaxで使用する文字コードがよくわからん

http://jsgt.org/ajax/ref/charset_test/responsetext/seu8xml/sample.htm
↑などが参考になったりするんだけど。それでもよくわからんかった。
やりたいことは、
サーバーサイドはjavaで、Ajaxでブラウザ側に返却するのはXML

サーバーサイドの処理としては、
1)Filterを実装したエンコードを行うフィルタ(エンコードWindows-31J)、SetCharacterEncodingFilter.java
2)StrutsのActionを実行し、forward
3)forward先で、レスポンスのXMLを生成するjspへ。jspXMLのtemplateとして利用する。
4)JSP内の定義は、XMLエンコードとしてUTF-8、contentType=text/xml、charset=UTF-8としている

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page contentType="text/xml; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page isELIgnored="false" %>
<dataList id="${param.id}" >
    <c:forEach var="element" items="${xxxxList}">
       <code="${element.code}" name="${element.name}"/>
    </c:forEach>
</dataList>

ブラウザ側のリクエストは、

var oj = createHttpRequest();
(中略)
oj.open(method,url,async);
oj.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=charset=UTF-8');

として、サーバーへリクエストを送っている。

上記でのブラウザに返却するXML(templateのJSP)で

<?xml version="1.0" encoding="Shift_JIS" ?>
<%@ page contentType="text/xml; charset=Shift_JIS" %>

<?xml version="1.0" encoding="Shift_JIS" ?>
<%@ page contentType="text/xml; charset=Windows-31J" %>

とすると、ブラウザがXMLとして認識できない。
oj.responseXML でエラーとなってしまう。
oj.responseText をalert表示すると、plainテキストとしてはXMLの構造を表示できるんだが。

改行コードなどの影響なのかな?

JSP内のShift_JISは、そのまま
SetCharacterEncodingFilterで、エンコードWindows-31Jから、UTF-8にしても
ブラウザはXMLとして認識できない。

ん・・・よくわからない。

追記 2008-09-30
一度は、ブラウザでXMLを取得できたんだが
後日、試してみたら やっぱり? だめだった。XMLパースエラーとなる。

alert(oj.responseText) で表示してみると以下のようになっていて

<?xml version="1.0" encoding="UTF-8" ?>


<dataList id="aaaaa" >

       <code="codo1" name="name1"/>

       <code="codo2" name="name2"/>

       <code="codo3" name="name3"/>
</dataList>

XMLのバージョン宣言、エンコード指定までは認識できるが
次の行から認識できない。
文字コードが原因で改行されている箇所がパースできずにエラーとなるのか・・・


JSPにFORWARDして、それをcontentType="text/xml; charset=UTF-8
で処理しているが
固定のxmlをサーバ側に配置し、そのXMLをレスポンスとして返却した場合だと
XMLパースエラーが発生しない。
なお、固定のxmlで、上記のXMLパースエラーとなるように
改行を含めた形でファイルを作成配置してもブラウザではXMLパースエラーが
発生しない。

ってことで、根本的解決にならんので、もうJSPにFORWARDするのをやめた。
org.w3c.dom.Documentを自前で作成して、

response.setContentType("text/xml; charset=UTF-8");
response.getOutputStream().print(DocumentをString化したもの)

として、レスポンスを返却させるようにした。

strutsのAction使ってるから return null; として処理する。