java web开发中文乱码全面解决攻略
作为工作多年的老鸟,遇到了很多中文乱码问题,但是总是通过google和try again and again的方式解决,大部分是通过设置new String的两个参数,用iso--8859-1, gb2312,gbk,utf-8相互转化来解决。至于原理是不了解的,下次遇到还是需要google。最近有同事又遇到中文乱码问题,通过new String解决后,下决心弄明白中文乱码的前因后果。
常用的编码如下:
iso--8859-1;
GB2312;
GBK;
UTF-8.
JSP页面可以设置字符集的地方至少有下面两处的地方:
pageEncoding属性说明该jsp在web服务器编译成class的编码方式,<meta content="utf-8">是说明浏览器需要用什么编码来解析该html文件。
POST方式:
参数是作为http的body来提交的,pageEncoding属性指定了提交到服务器的编码字符集。服务器端的tomcat默认是以 iso--8859-1字符集来解码,可以通过方法:
request.setCharacterEncoding("字符集");
来指定字符集来解码参数。jsp的pageEncoding和服务器端的 request.setCharacterEncoding字符集必须一致,否则就会产生乱码。
比如:上面的JSP的pageEncoding="UTF-8",服务器端就必须用 request.setCharacterEncoding("UFT-8")来指定接受字符集,然后用request.getParameter("参数")来接收参数,这样就不会出现中文乱码。
一般服务器端通过写一个filter来设置 request.setCharacterEncoding("UFT-8")达到简化的目的,比如spring的filterorg.springframework.web.filter.CharacterEncodingFilter。
POST的方式的http文件头如下:
http的body如下:
GET方式:
假如没有指定jsp的form标签的method的属性,默认提交就是GET方式提交。或者直接指定属性method=“GET”。
GET方式提交参数是作为url的参数来提交的,而不是http的body。服务器端的方法request.setCharacterEncoding("UTF-8");对于GET方式提交的参数没有作用。因为servlet规范文档里面提到该方法的作用范围。
Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().
可以看出对于get方法他是无能为力的。那如何对GET方式提交的参数指定编码呢,可以在服务器里设置,tomcat可以如下设置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
URIEncoding属性设置了GET提交的参数的编码方式,假如不设置的话,默认是用 iso--8859-1来解码,
设置的URIEncoding属性必须跟JSP页面的pageEncoding指定的字符集一致,和<meta content="utf-8">的设置无关。
GET方式的http的文件头是:
http的body的内容是空: