您的位置:首页 > 其它

Ajax取得XML响应的中文乱码问题(持续整理中...)

2008-03-06 15:39 573 查看
首先,讨论一下HTML页面发送请求到JSP页面并返回XML的情况,请看下面的表格。

Html-charset表示的是发出请求的HTML页面采用的编码格式。(<meta http-equiv="content-type" content="text/html; charset=UTF-8">)

Jsp-pageEncoding表示的是生成XML串并产生响应的JSP页面的编码格式。(<%@ page language="java" pageEncoding="UTF-8" %>)

setContentType-charset表示的是response响应的编码格式。(默认)表示没有明确使用response.setContentType("text/xml;charset=UTF-8")进行设置,此时的响应编码格式与页面编码格式相同;(设置)则表示使用上面的语句在Jsp页面中进行了设置,此时的响应编码格式由上面方法传入的参数决定。

xml-encoding表示发送的xml串中是否由xml声明<?xml version=/"1.0/" encoding=/"GBK/"?>,无表示没有使用声明,其他表示有具体声明版本和编码。

最后两列表示的是是否收到响应,N表示没有成功,Y表示成功,Y 乱码:...表示收到响应,但是乱码。

Ajax:HTML页面发送请求到JSP页面并返回XML
Html-charsetJsp-pageEncodingsetContentType-charsetxml-encodingText是否成功XML是否成功
ISO-8859-1UTF-8UTF-8(默认)YY
ISO-8859-1UTF-8GB2312(设置)YN
ISO-8859-1UTF-8GBK(设置)YN
ISO-8859-1GB2312UTF-8(设置)YY
ISO-8859-1GB2312GB2312(默认)YN
ISO-8859-1GB2312GBK(设置)YN
ISO-8859-1GBKUTF-8(设置)YY
ISO-8859-1GBKGB2312(设置)YN
ISO-8859-1GBKGBK(默认)YN
ISO-8859-1UTF-8UTF-8(默认)UTF-8YY
ISO-8859-1UTF-8UTF-8(默认)GB2312YY 乱码:涓枃
ISO-8859-1UTF-8UTF-8(默认)GBKYY 乱码:涓枃
ISO-8859-1UTF-8GB2312(设置)UTF-8YN
ISO-8859-1UTF-8GB2312(设置)GB2312YY
ISO-8859-1UTF-8GB2312(设置)GBKYY
ISO-8859-1UTF-8GBK(设置)UTF-8YN
ISO-8859-1UTF-8GBK(设置)GB2312YY
ISO-8859-1UTF-8GBK(设置)GBKYY
ISO-8859-1GB2312UTF-8(设置)UTF-8YY
ISO-8859-1GB2312UTF-8(设置)GB2312YY 乱码:涓枃
ISO-8859-1GB2312UTF-8(设置)GBKYY 乱码:涓枃
ISO-8859-1GB2312GB2312(默认)UTF-8YN
ISO-8859-1GB2312GB2312(默认)GB2312YY
ISO-8859-1GB2312GB2312(默认)GBKYY
ISO-8859-1GB2312GBK(设置)UTF-8YN
ISO-8859-1GB2312GBK(设置)GB2312YY
ISO-8859-1GB2312GBK(设置)GBKYY
ISO-8859-1GBKGBK(默认)GBKYY
ISO-8859-1GBKGBK(默认)UTF-8YN
ISO-8859-1GBKGBK(默认)GB2312YY
ISO-8859-1GBKUTF-8(设置)UTF-8YY
ISO-8859-1GBKUTF-8(设置)GB2312YY 乱码:涓枃
ISO-8859-1GBKUTF-8(设置)GBKYY 乱码:涓枃
ISO-8859-1GBKGB2312(设置)UTF-8YN
ISO-8859-1GBKGB2312(设置)GB2312YY
ISO-8859-1GBKGB2312(设置)GBKYY
下面对以上情况作一下总结:

1.首先HTML页面的的编码格式这里统一采用ISO-8859-1,我也测试过其他情况的,对页面的中文显示并无影响。

2.从上面的表格可以看出,大体上情况分两种:生成xml串时没有添加xml声明;有xml声明。因为这里要传递中文,所以这里不讨论响应页面采用ISO-8859-1的情况。

3.没有xml声明的时候,从表格可以看出response响应必须使用UTF-8格式进行编码,才能正确收到xml中包含的中文。

4.在添加xml声明的时候:如果response响应使用UTF-8格式,而xml声明为GB2312或GBK格式,此时可以收到xml响应,但是中文会产生乱码;如果xml声明为UTF-8格式,而response为GBK或GB2312是,无法收到响应;其他发送方式可以成功收到响应。

5.以发送普通文本格式响应不受编码格式影响(ISO-8859-1除外)。

二、下面我们在看一下从HTML页面发送请求到Servlet并返回XML的情况。

Html-charset表示的是发出请求的HTML页面采用的编码格式。(<meta http-equiv="content-type" content="text/html; charset=UTF-8">)

setContentType-charset表示的是response响应的编码格式。(默认)表示没有明确使用response.setContentType("text/xml;charset=UTF-8")进行设置,此时的响应编码格式在Java中默认的是ISO-8859-1;(设置)则表示使用上面的语句在Java中进行了设置,此时的响应编码格式由上面方法传入的参数决定。

xml-encoding表示发送的xml串中是否由xml声明<?xml version=/"1.0/" encoding=/"GBK/"?>,无表示没有使用声明,其他表示有具体声明版本和编码。

最后两列表示的是是否收到响应,N表示没有成功,Y表示成功,Y 乱码:...表示收到响应,但是乱码。

Ajax:HTML页面发送请求到Servlet并返回XML
Html-charsetsetContentType-charsetxml-encodingText是否成功XML是否成功
ISO-8859-1ISO-8859-1(默认)Y 乱码:??Y 乱码:??
ISO-8859-1UTF-8(设置)YY
ISO-8859-1GB2312(设置)YN
ISO-8859-1GBK(设置)YN
ISO-8859-1ISO-8859-1(默认)UTF-8Y 乱码:??Y 乱码:??
ISO-8859-1ISO-8859-1(默认)GB2312Y 乱码:??Y 乱码:??
ISO-8859-1ISO-8859-1(默认)GBKY 乱码:??Y 乱码:??
ISO-8859-1UTF-8(设置)UTF-8YY
ISO-8859-1UTF-8(设置)GB2312YY 乱码:涓枃
ISO-8859-1UTF-8(设置)GBKYY 乱码:涓枃
ISO-8859-1GB2312(设置)UTF-8YN
ISO-8859-1GB2312(设置)GB2312YY
ISO-8859-1GB2312(设置)GBKYY
ISO-8859-1GBK(设置)UTF-8YN
ISO-8859-1GBK(设置)GB2312YY
ISO-8859-1GBK(设置)GBKYY
从表格内容可以看出:

1.当用ISO-8859-1发送响应的时候,必定乱码。

2.当不添加xml声明的时候,只有用UTF-8编码格式发送请求才会成功,并且不会产生乱码。

3.使用xml声明时:如果xml声明为UTF-8格式,而response使用GB2312或GBK格式,无法收到响应;response使用UTF-8格式而xml声明为GB2312或GBK格式,得到的是乱码。其他方式可以收到正确的xml响应。

4.responseText不受编码格式的影响。(ISO-8859-1除外)

三、最后在看一下有HTML页面直接请求XML文件时的情况。

Ajax:HTML页面直接请求XML文件
Html-charsetxml-encodingText是否成功XML是否成功
ISO-8859-1YY
UTF-8YY
GB2312YY
GBKYY
ISO-8859-1UTF-8YY
ISO-8859-1GB2312Y 乱码??Y
ISO-8859-1GBKY 乱码??Y
从表格可以看出:无论xml文件有无声明或者声明编码为什么格式,中文xml响应都可以成功,而当xml声明为GB2312或GBK格式时responseText中文乱码

最后时我在测试时使用的HTML文件,JSP文件,XML文件和Java文件。

MyHtml.html----------------------------------------------------------------------------------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>MyHtml.html</title>

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=GBK">

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<script type="text/javascript">

var xhr;

function createXMLHttpRequest() {
if (window.ActiveXObject) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
}
}

function sendRequest() {
createXMLHttpRequest();
var date = new Date().toString();
var url = "MyXml.xml?date=" + date;
xhr.open("GET", url, true);
xhr.onreadystatechange = handleStateChange;
xhr.send(null);
}

function handleStateChange() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var responseXML = xhr.responseXML;
var responseText = xhr.responseText;
var ta = document.getElementById("ta");
ta.value = "new response -------------------------------";
var ct = xhr.getResponseHeader("Content-Type");
ta.value += "/nresponseCT:" + ct;
ta.value += "/n/nText:" + responseText;
var cns = responseXML.getElementsByTagName("cn");
if (cns.length > 0) {
ta.value += "/n/nXML:" + cns[0].firstChild.nodeValue;
}
else if (cns.length == 0) {
ta.value += "/n/nXML:responseXML failed"
}
ta.value += "/nover -----------------------------------"
}
}
}

</script>
</head>

<body>
This is my HTML page. <br>
<input type="button" value="send" onclick="sendRequest()">
<br>
<textarea id="ta" name="ta" rows="20" cols="100"></textarea>
</body>
</html>
MyJsp.jsp----------------------------------------------------------------------------------------------------

<%@ page language="java" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'MyJsp.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
This is my JSP page. <br>
<%
System.out.println("req:" + request.getContentType());
System.out.println("old:" + response.getContentType());
String cont = "<?xml version=/"1.0/" encoding=/"GBK/"?>";
cont = "<xml-body><cn>中文</cn></xml-body>";
response.setContentType("text/xml;charset=gb2312");
java.io.PrintWriter pr = response.getWriter();
System.out.println("new:" + response.getContentType());
pr.write(cont);
pr.close();
%>
</body>
</html>
MyXml.xml----------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="gb2312"?>
<xml-body>
<cn>中文</cn>
</xml-body>
MyServlet.java------------------------------------------------------------------------------------------------

package test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("req:" + request.getContentType());
System.out.println("old:" + response.getContentType());
String cont = "<?xml version=/"1.0/" encoding=/"GBK/"?>";
cont += "<xml-body><cn>中文</cn></xml-body>";
response.setContentType("text/xml; charset=GBK");
java.io.PrintWriter pr = response.getWriter();
System.out.println("new:" + response.getContentType());
pr.write(cont);
pr.close();
}

@Override
protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(arg0, arg1);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: