首先,讨论一下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-charset | Jsp-pageEncoding | setContentType-charset | xml-encoding | Text是否成功 | XML是否成功 |
ISO-8859-1 | UTF-8 | UTF-8(默认) | 无 | Y | Y |
ISO-8859-1 | UTF-8 | GB2312(设置) | 无 | Y | N |
ISO-8859-1 | UTF-8 | GBK(设置) | 无 | Y | N |
ISO-8859-1 | GB2312 | UTF-8(设置) | 无 | Y | Y |
ISO-8859-1 | GB2312 | GB2312(默认) | 无 | Y | N |
ISO-8859-1 | GB2312 | GBK(设置) | 无 | Y | N |
ISO-8859-1 | GBK | UTF-8(设置) | 无 | Y | Y |
ISO-8859-1 | GBK | GB2312(设置) | 无 | Y | N |
ISO-8859-1 | GBK | GBK(默认) | 无 | Y | N |
ISO-8859-1 | UTF-8 | UTF-8(默认) | UTF-8 | Y | Y |
ISO-8859-1 | UTF-8 | UTF-8(默认) | GB2312 | Y | Y 乱码:涓枃 |
ISO-8859-1 | UTF-8 | UTF-8(默认) | GBK | Y | Y 乱码:涓枃 |
ISO-8859-1 | UTF-8 | GB2312(设置) | UTF-8 | Y | N |
ISO-8859-1 | UTF-8 | GB2312(设置) | GB2312 | Y | Y |
ISO-8859-1 | UTF-8 | GB2312(设置) | GBK | Y | Y |
ISO-8859-1 | UTF-8 | GBK(设置) | UTF-8 | Y | N |
ISO-8859-1 | UTF-8 | GBK(设置) | GB2312 | Y | Y |
ISO-8859-1 | UTF-8 | GBK(设置) | GBK | Y | Y |
ISO-8859-1 | GB2312 | UTF-8(设置) | UTF-8 | Y | Y |
ISO-8859-1 | GB2312 | UTF-8(设置) | GB2312 | Y | Y 乱码:涓枃 |
ISO-8859-1 | GB2312 | UTF-8(设置) | GBK | Y | Y 乱码:涓枃 |
ISO-8859-1 | GB2312 | GB2312(默认) | UTF-8 | Y | N |
ISO-8859-1 | GB2312 | GB2312(默认) | GB2312 | Y | Y |
ISO-8859-1 | GB2312 | GB2312(默认) | GBK | Y | Y |
ISO-8859-1 | GB2312 | GBK(设置) | UTF-8 | Y | N |
ISO-8859-1 | GB2312 | GBK(设置) | GB2312 | Y | Y |
ISO-8859-1 | GB2312 | GBK(设置) | GBK | Y | Y |
ISO-8859-1 | GBK | GBK(默认) | GBK | Y | Y |
ISO-8859-1 | GBK | GBK(默认) | UTF-8 | Y | N |
ISO-8859-1 | GBK | GBK(默认) | GB2312 | Y | Y |
ISO-8859-1 | GBK | UTF-8(设置) | UTF-8 | Y | Y |
ISO-8859-1 | GBK | UTF-8(设置) | GB2312 | Y | Y 乱码:涓枃 |
ISO-8859-1 | GBK | UTF-8(设置) | GBK | Y | Y 乱码:涓枃 |
ISO-8859-1 | GBK | GB2312(设置) | UTF-8 | Y | N |
ISO-8859-1 | GBK | GB2312(设置) | GB2312 | Y | Y |
ISO-8859-1 | GBK | GB2312(设置) | GBK | Y | Y |
下面对以上情况作一下总结:
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-charset | setContentType-charset | xml-encoding | Text是否成功 | XML是否成功 |
ISO-8859-1 | ISO-8859-1(默认) | 无 | Y 乱码:?? | Y 乱码:?? |
ISO-8859-1 | UTF-8(设置) | 无 | Y | Y |
ISO-8859-1 | GB2312(设置) | 无 | Y | N |
ISO-8859-1 | GBK(设置) | 无 | Y | N |
ISO-8859-1 | ISO-8859-1(默认) | UTF-8 | Y 乱码:?? | Y 乱码:?? |
ISO-8859-1 | ISO-8859-1(默认) | GB2312 | Y 乱码:?? | Y 乱码:?? |
ISO-8859-1 | ISO-8859-1(默认) | GBK | Y 乱码:?? | Y 乱码:?? |
ISO-8859-1 | UTF-8(设置) | UTF-8 | Y | Y |
ISO-8859-1 | UTF-8(设置) | GB2312 | Y | Y 乱码:涓枃 |
ISO-8859-1 | UTF-8(设置) | GBK | Y | Y 乱码:涓枃 |
ISO-8859-1 | GB2312(设置) | UTF-8 | Y | N |
ISO-8859-1 | GB2312(设置) | GB2312 | Y | Y |
ISO-8859-1 | GB2312(设置) | GBK | Y | Y |
ISO-8859-1 | GBK(设置) | UTF-8 | Y | N |
ISO-8859-1 | GBK(设置) | GB2312 | Y | Y |
ISO-8859-1 | GBK(设置) | GBK | Y | Y |
从表格内容可以看出:
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-charset | xml-encoding | Text是否成功 | XML是否成功 |
ISO-8859-1 | 无 | Y | Y |
UTF-8 | 无 | Y | Y |
GB2312 | 无 | Y | Y |
GBK | 无 | Y | Y |
ISO-8859-1 | UTF-8 | Y | Y |
ISO-8859-1 | GB2312 | Y 乱码?? | Y |
ISO-8859-1 | GBK | Y 乱码?? | 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" οnclick="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);
}
}