AJAX使用中的编码、解码、乱码问题(针对JAVA)
AJAX使用中的编码、解码、乱码问题!!!
1. POST请求时的乱码问题!!!
1>针对服务器端接收到的浏览器端传输过来的数据的乱码问题!!!
(1)乱码产生的原因?
所有浏览器提供的AJAX对象请求参数默认使用 UTF-8 进行编码;而服务器端默认使用 ISO-8859-1 去解码,编码与解码方式不一致导致了乱码的产生。
(2)如何解决乱码问题?
服务器端使用 request.setCharacterEncoding("UTF-8"); 来明确指明服务器端使用 UTF-8 进行解码。
(注意:火狐浏览器可以不加这句话,因为火狐在发送请求数据包的时候会明确的告诉服务器它使用的是哪种编码方式进行的数据编码。)
2>针对浏览器端接收到的服务器端传输过来的数据的乱码问题!!!
(1)乱码产生的原因?
服务器端默认使用 ISO-8859-1 进行编码,而浏览器端的解码方式是由服务器端的编码方式决定的,所以此时浏览器端的解码方式也为 ISO-8859-1 方式,此时虽然服务器端与浏览器端的编码与解码方式一致,但是由于 ISO-8859-1本身并不支持中文编码与解码方式,所以才会有乱码的产生。
(2)如何解决乱码问题?
服务器端使用 response.setContentType("text/html;charset=utf-8"); 明确指明服务器端的编码方式和浏览器端的解码方式统一为:UTF-8。
总结:浏览器端的AJAX对象默认编码方式为UTF-8, 解码方式默认与服务器端的编码方式一致; 而服务器端的默认编码和解码方式都为 ISO-8859-1。
所以如果浏览器端的编码方式和服务器端的解码方式不一样会产生乱码。
由于浏览器端的解码方式由服务器端的编码方式而定,所以浏览器与服务器的解码和编码方式是一致的,只需要他们的编解码方式支持中文就不会出现乱码的问题了。
注意:UTF-8 支持中文编码和解码方式,所以当服务器端和浏览器端都使用统一的编码和解码方式:UTF-8 ,即可解决中文乱码问题;
由于 ISO-8859-1 本身并不支持中文的编码和解码,所以即使服务器端和浏览器端都使用统一的编码和解码方式:ISO-8859-1 也会产生中文乱码的问题。
2. GET请求时的乱码问题!!!(注意:如果不明确指明请求方式,则浏览器默认使用GET请求方式发送请求!!!)
1> 针对服务器端接收到的浏览器端传输过来的数据的乱码问题!!!
(1) 乱码产生的原因?
IE浏览器提供的AJAX对象会使用 GBK 字符集对请求参数进行编码,而其他的浏览器会使用 UTF-8 进行编码;而服务器端默认统一使用 ISO-8859-1 去解码,编码与解码方式不一致导致了乱码的产生。
(2) 如何解决乱码问题?
<1> 针对IE浏览器通过使用 encodeURI 对请求地址进行编码(encodeURI会默认使用utf-8对请求地址中的中文参数进行编码。)
注意:只有IE浏览器才需要使用encodeURI()进行编码,其他浏览器不需要使用encodeURI()进行编码(因为其它浏览器默认的编码方式是UTF-8,只有IE是GBK编码方式,需要额外为IE浏览器的地址使用UTF-8进行编码)。
例如: var uri='check.form?uname='+ document.getElementById('userName').value;
xhr.open('get',encodeURI(uri),true);
<2> 服务器端通过为Connector元素添加 uriEncoding="utf-8" 属性明确指明字符集解码方式为utf-8
例如:tomcat 可以通过修改 config/server.xml文件中的 <Connector connectionTimeout="20000" port="8088" protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>,使得tomcat服务器按照uriEncoding指定的解码方式 utf-8 进行解码。
2> 针对浏览器端接收到的服务器端传输过来的数据的乱码问题!!!(与post请求方式一样)
(1)乱码产生的原因?
服务器端默认使用 ISO-8859-1 进行编码,而浏览器端的解码方式是由服务器端的编码方式决定的,所以此时浏览器端的解码方式也为 ISO-8859-1 方式,此时虽然服务器端与浏览器端的编码与解码方式一致,但是由于 ISO-8859-1本身并不支持中文编码与解码方式,所以才会有乱码的产生。
(2)如何解决乱码问题?
服务器端使用 response.setContentType("text/html;charset=utf-8"); 明确指明服务器端的编码方式和浏览器端的解码方式统一为:UTF-8
总之,如果使用 AJAX的情况下: JSP 与 Servlet之间传输数据出现乱码的问题,需要检查以下四个地方:
1. 浏览器端 (只针对IE浏览器):
xhr.open('get',encodeURI(uri),true);
2. 服务器端:
1) server.xml (只针对GET请求方式):
<Connector connectionTimeout="20000" port="8088" protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>
2) Java代码:
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");