简述
(资料图片)
乱码是JAVA开发时经常遇到的问题。主要出现在四种情况:
1.系统接口之间
2.POST提交数据
3.GET提交数据和URL路径
4.页面乱码
系统接口之间乱码
需要双方定义编码方式。例如:GBK(以下都以GBK为例)。
发送的时候将String按GBK转换为了字节码
out.write(loginStr.get(0).getBytes("GBK"));//out为输出流
接收的时候将字节码按GBK编码转换成String
new String(by, 0, a, "GBK");//by为字节码,a为字节码长度
POST 乱码
一般由Filter设置字符集,开发人员无需关注。
request.setCharacterEncoding("GBK");
特殊情况下,各个Servlet也可以按照上面代码设置。
但要注意,必须在取第一个参数之前就要设置。
另外
(1)上面这个代码只能设置post提交的requestbody的编码而不是设置get方法提交的queryString的编码。该方法告诉应用服务器应该采用什么编码解析post传过来的内容。
(2)HttpServletRequest.getPathInfo()返回的结果是由Servlet服务器解码(decode)过的。
(3)HttpServletRequest.getRequestURI()返回的字符串没有被Servlet服务器decoded过。
(4)POST提交的数据是作为request body的一部分。
(5)网页的Http头中ContentType("text/html;charset=GBK")的作用:
(a)告诉浏览器网页中数据是什么编码;
(b)表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。
(c)这里所说的ContentType是指http头的ContentType,而不是在网页中meta中的ContentType。
GET乱码和URL路径乱码
URL路径乱码是指用中文路径,如…/中文路径/test.jsp
GET乱码需要在中间件的配置文件里设置.
(1) tomcat服务器
对于tomcat服务器,该文件是server.xml
<CONNECTORPORT="8080" protocol="HTTP/1.1" <="" p="">
maxThreads="150"connectionTimeout="20000"
redirectPort="8443"URIEncoding="GBK"/>
URIEncoding告诉服务器servlet解码URL时采用的编码。
useBodyEncodingForURI告诉服务器解码URL时候需要采用request body指定的编码。
(2) weblogic服务器
对于weblogic服务器,该文件是weblogic.xml
GBK
另外:
不同的浏览器对于GET方式提交的中文和路径中文都会按照URLEncode自动编码。
(1)对于中文IE,如果在高级选项中选中总以UTF-8发送(默认方式),则PathInfo是URLEncode是按照UTF-8编码,QueryString是按照GBK编码。
http://localhost:8080/example/ 中国?name=中国
实际上提交是:
GET /example/$E4$B8$AD$E5$9B$BD?name=$D6$D0$B9$FA($改为%)
(2)对于中文IE,如果在高级选项中取消总以UTF-8发送,则PathInfo和QueryString是URLencode按照GBK编码。
实际上提交是:
GET/example/$D6$D0$B9$FA?name=$D6$D0$B9$FA($改为%)
(3)对于中文firefox,则pathInfo和queryString都是URLencode按照GBK编码。实际上提交是:
GET/example/$D6$D0$B9$FA?name=$D6$D0$B9$FA($改为%)
很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码。对于中文的IE和FIREFOX都是采用GBK编码QueryString。
因此一般情况下,我们尽量使用英文路径,而不是中文路径。提交方式尽量使用POST,如果必须要使用GET方式,请主动将PathInfo和QueryString按配置文件中的编码URLEncode。即:直接按统码转换成$D6$D0$B9$FA此种类型的数据。
页面乱码
浏览器根据http头中的ContentType("text/html;charset=GBK"),指定的字符集来解码服务器发送过来的字节流。
1.Servlet中调用HttpServletResponse.setContentType()设置http头的ContentType。
2.Jsp: