大二的时候,上了J2EE课,学习了古老的Jsp + Servlet + Javabean框架,大作业中有一项是一个研究报告。当时稚嫩的我以为就是随便一个报告,于是把开发J2EE过程中遇到的中文乱码解决方法总结了一下。【后来我才知道研究报告是要写1w+的读后感式的论文总结hhhh。。。不过事实证明我们老师根本没看。。。Fine
环境:Win7,MyEclipse+Mysql+Tomcat
注意:这是最原始的Jsp + Servlet + Javabean模式写的J2EE工程中出现的问题,我并没有深入研究其他先进的框架跟这个框架的原理有什么不同,所以并不一定适用于其他地方。
我们在做网站、系统的时候,不可避免的会处理到中文或其他特殊符号。如果字符编码不能很好地统一起来,那么在页面中、发送和获取信息时就会有乱码出现。这次做图书管理系统的时候,刚开始就遇到了乱码的问题,将所有数据库和页面全部设置成同一编码(UTF-8)后还是有问题,后来再设置请求(request)和响应(response)的一些编码属性,又出现了URL编码乱码的问题(Tomcat默认URL编码为GB2312),于是再设置Tomcat配置中的URLEncoding,才终于消灭了中文字符乱码的的问题。这曲折的过程让我对中文编码有了进一步的了解。通过上网百度这些问题,明白了虽然同是对中文字符的编码格式,但即使是同一个汉字,不同的格式会有不同的编码。想要消灭乱码,除了老师课件上提到的方法,需要配置的东西还有很多。
以“UTF-8”为例。如果想将所有编码全设置成“UTF-8”,需要做的包括但不限于以下方法:
1、先将数据库编码设置成“UTF-8”格式,这样就不需要在对数据库进行操作时再转码:
1.1创建数据库时设置数据库编码:CREATE DATEBASE library character set utf8;
1.2创建后修改数据库编码:首先使用语句show variables like "% character %"查看哪些编码不是“UTF-8”的才需要修改,修改语句如:set character_set_client = utf8;
2、若JSP页面显示出现乱码:
方法:
在JSP中,使用page指令告诉客户端:设置jsp文件本身的编码:<%@ page language="java" page Encoding="UTF-8"%>;设置服务器发送给客户端时的内容编码:<%@ page contentType="text/html;charset=UTF-8"%>。
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。
原理:
第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效。
3、若是servlet传递参数后跳转时出现乱码:
方法:
指定 HTTP 响应的编码,同时指定浏览器显示的编码:在servlet里的dopost方法里加上response.setContentType("text/html;charset=UTF-8");在servlet里的PrintWriterout=response.getWriter()之前加上request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
原理:
response.setContentType("text/xml;charset=UTF-8")是设置页面中为中文编码前者是设置动态文字(参数,数据库),后者设置页面静态文字。response.setContentType指定 HTTP 响应的编码,同时指定了浏览器显示的编码。response.setCharacterEncoding设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置。
request.setCharacterEncoding()是设置从request中取得的值或从数据库中取出的值,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。
在实践中还发现,要是servlet传递参数乱码,那么它跳转到的JSP页面也会出现乱码。
4、若是servlet传递参数后跳转时出现乱码:
方法:
在JSP中接收参数的语句前加上request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
原理同上。
5、若URL传递中文参数乱码:
方法:
其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。在这里修改Tomcat的conf目录下的server.xml配置文件,具体改后的代码如下:
<Connector port="8080"protocol="HTTP/1.1"
URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" />
6、表单提交中文乱码:
方法:
在接收数据时对数据的字符编码进行转换:
String name=request.getParameter(“tt”);
name=new String(name.getBytes(“UTF-8”),“ISO8859-1”);
原理:
产生种结果的原因是客户端和服务器交互过程中,在客户端和服务器用的是UTF-8对汉字编码,Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。对于这个问题可以采用转换编码格式的方法来解决。
以上是我做系统的时候亲测可用的方法,至少在本地是可以没有乱码地运行下去了。

被折叠的 条评论
为什么被折叠?



