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へ。jspをXMLの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; として処理する。