论坛首页 Web前端技术论坛

XMLHTTP中文乱码

浏览 15322 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-03-21  
代码如下

HTML;

<html>
  <head>
    <title>Using Ajax for validation</title>
 
    <script type="text/javascript">
        var xmlHttp;

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

        function validate() {
            createXMLHttpRequest();
            var date = document.getElementById("birthDate");
            var url = "ValidationServlet?birthDate=" + escape(date.value);
            xmlHttp.open("GET", url, true);
            xmlHttp.onreadystatechange = callback;
            xmlHttp.send(null);
        }

        function callback() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                    var mes = xmlHttp.responseXML.getElementsByTagName("message")[0].firstChild.data;
                    var val = xmlHttp.responseXML.getElementsByTagName("passed")[0].firstChild.data;
                    setMessage(mes, val);
                }
            }
        }
       
        function setMessage(message, isValid) {           
            var messageArea = document.getElementById("dateMessage");
            var fontColor = "red";
           
            if (isValid == "true") {
                fontColor = "green";               
            }
            messageArea.innerHTML = "<font color=" + fontColor + ">" + message + " </font>";
        }

    </script>
  </head>
  <body>
    <h1>Ajax Validation Example</h1>
    Birth date: <input type="text" size="10" id="birthDate" onchange="validate();"/>
    <div id="dateMessage"></div>
  </body>
</html>


ValidationServlet
public class ValidationServlet extends HttpServlet {   
   
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        PrintWriter out = response.getWriter();
       
        boolean passed = validateDate(request.getParameter("birthDate"));
        response.setContentType("text/xml");
        response.setHeader("Cache-Control", "no-cache");
        String message = "You have entered an invalid date.";
       
        if (passed) {
            message = "You have entered a valid date.";
        }
        out.println("<response>");
        out.println("<passed>" + Boolean.toString(passed) + "</passed>");
        out.println("<message>" + message + "</message>");
        out.println("</response>");
        out.close();
     }
   
    /**
     * Checks to see whether the argument is a valid date.
     * A null date is considered invalid. This method
     * used the default data formatter and lenient
     * parsing.
     *
     * @param date a String representing the date to check
     * @return message a String represnting the outcome of the check
     */
    private boolean validateDate(String date) {
       
        boolean isValid = true;
        if(date != null) {
            SimpleDateFormat formatter= new SimpleDateFormat("MM/dd/yyyy");
            try {
                formatter.parse(date);
            } catch (ParseException pe) {
                System.out.println(pe.toString());
                isValid = false;
            }
        } else {
            isValid = false;
        }
        return isValid;
    }
}

其中 message 的信息 换成中文怎么打印出乱码呢 怎样解决呢?
   发表时间:2006-03-22  
1、增加:response.setContentType("text/xml; CHARSET=utf8");

2、out.println("<?xml version='1.0' encoding='GBK'?>\n");
0 请登录后投票
   发表时间:2006-03-22  
呵呵 不行 不行 啊 都试了N边了
0 请登录后投票
   发表时间:2006-03-22  
<script language="VBScript">
function bin2str(bin);
	dim tmp,ustr
	tmp=""
	for i=1 to LenB(bin);-1
	ustr=AscB(MidB(bin,i,1););
	if ustr>127 then
	i=i+1
	tmp=tmp&chr(ustr*256+AscB(MidB(bin,i,1);););
	else
	tmp=tmp&chr(ustr);
	end if
	next
	bin2str=tmp
end function
</script>


用这个VBScript方法对request.responseBody进行GB2312解码
0 请登录后投票
   发表时间:2006-03-22  
zlsunnan 写道
呵呵 不行 不行 啊 都试了N边了


可以刷新缓存后再试试 YuLimin 的方法,

如果是直接在servlet里输入中文的话, 检查servlet 编译时是否是中文Locale。

再否则,建议统一使用UTF-8编码方案,中文从ResourceBundle中获取。
0 请登录后投票
   发表时间:2006-04-04  
YuLimin 的方法应该是没问题的,你可以把传给客户端的xml输出到后台看看是否已经是乱码
0 请登录后投票
   发表时间:2006-04-05  
&lt;META http-equiv="Content-Type" content="text/html;charset=UTF-8" /&gt;


String encoding="UTF-8";
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
out.println("&lt;?xml version='1.0' encoding='"+encoding+"' ?&gt;");


(In Tomcat server.xml)
&lt;Connector ... URIEncoding="UTF-8"&gt;

这是我处理乱码的三板斧(能设的地方全设成UTF-8),希望有所帮助
0 请登录后投票
   发表时间:2006-04-05  
我使用ajax的时候也出现乱码,统一改成utf-8就好了。包括用dojo.require进来的js也是,不用utf-8统统乱码。我怀疑是xmlhttp的问题。
0 请登录后投票
   发表时间:2006-09-18  
采用统一的UTF-8编码是可以解决中文问题,但是特殊字符问题怎么解决呢?如 $ % ^ & +
0 请登录后投票
   发表时间:2006-10-18  
$ % ^ & +  用html转意编码
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics