ajax乱码解决总结
先说说Ajax乱码的来源问题,为什么会出现乱码呢?!在Web应用程序中,常用的编码方式包括GBK、GB2312、UTF-8/UTF-16/UTF-32、ISO8859_1。其中,ISO8859_1用来编码拉丁文,其由单字节(0--255)组成。GBK、GB2312用于编码简体中文,它们由单字节和双字节混合组成,最高位为1的字节和下一个字节构成一个汉字,最高位为0的字节是ASCII码。UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。用得最多的是UTF-8,主要是因为它在对拉丁文编码时节约空间,而且可以表示各个语种,容易国际化。通常,Web应用程序采用GBK或者GB2312来显示中文内容。常用的,Ajax有两种方式可以向服务器传送请求内容,一种是GET,将请求内容以“?parameterName1=value1¶meterName2=value2”字符串的形式附加在URI后面,以附加参数的形式交给XMLHttpRequest对象的open()方法传送;另外一种是POST,加功能请求内容以“parameterName1=value1¶meterName2=value2”字符串的形式传递给XMLHttpRequest对象的send()方法传送。在Ajax应用程序中,对于GET方式,与传统的通信方式一样,XMLHttpRequest对象会将请求的URI连同附带参数一起编码,所有空格、标点、重音符号以及其他非ASCII字符都用%xx编码代替,其中xx等于表示该字符的十六进制数。例如,空格返回的是"%20"。在Tomcat中,如果从http请求中获取的中文内容未经过编码(直接通过request.getParameter()方法获取),其将显示为“?????”等形式的乱码。对于POST方式,默认的XMLHttpRequest对象则采用UTF-8的编码方式传送。如果Web应用程序本来就是用的UTF-8编码的话,那么接收到的数据是正常的;如果其编码是GB2312的话,问题就来了,POST过来的数据是UTF-8,而整个Web应用程序是用GB2312来显示,那么所有的中文字符将全部变成乱码。对于Ajax应用程序来说,为保证中文内容顺利显示,可以采取如下方式统一编码。1、JSP文件统一采用GB2312或者ISO8859_1的编码方式。2、在Servlet或者JSP中获取以GET方式传送的中文内容,将其以GB2312或者ISO8859_1的方式转码再保存或者显示。3、在Servlet或者JSP中获取以POST传送的中文内容,将其以UTF-8的方式转码再保存或者显示。4、也可以让所有的JSP、Servlet、Java类都使用UTF-8的编码方式,不过这还需要调整相应的IDE设置或者Web服务器设置。
这个问题不是靠写出什么教程之类的东西就能理解和解决的.
最重要的是你要知道xmlhttp在底层是如何和服务端通信的,也就是它是如何读取服务端返回的内容.
responseText:
能解释UCS-2或者UCS-4,默认以UTF-8来解释服务端返回的字符流,不对字符流的内容做任何判断,所以你的innerHTML.xml中写的<?xmlversion="1.0"encoding="GBK"?>对这个函数没有任何意义,因为它只是文本流中的一行字符内容.
responseXml:
对接收回来的数据作为dom对象来解析,当然会对其中的内容如字符集,DTD,schema,等做相应解析,简单说不仅仅是"接收",而且要"处理"
responseBody:
任何内容以原始的二进制byte接收,(在网络层就是原始的ununsignedchar序列,java中表示为byte)不对内容做任何字符集假设.但它一次性将数据返回为一个byte[]
responseStream:
同上,但返回为一个流接口,要你自己从中读取byte
所以如果你仅把一个名为xml的文档作为原始文本文件用responseText返回,你在文档里面任何设置属性都不会起作用.