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

首先,讨论一下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" ο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);
    }

}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值