在介绍方法以前咱们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的JSP中文乱码问题有以下几个方面:页面乱码、参数乱码、表单乱码、源文件乱码。下面来逐一解决其中的乱码问题。html
1、JSP页面中文乱码前端
在JSP页面中,中文显示乱码有两种状况:一种是HTML中的中文乱码,另外一种是在JSP中动态输出的中文乱码。java
先看一个JSP程序:编程
<%@ page language="java" import="java.util.*" %> <html> <head> <title>中文显示示例</title> </head> <body> 这是一个中文显示示例: <% String str = "中文"; out.print(str); %> </body> </html>
上面这个JSP程序看起来好像是在页面显示几句中文并且标题也是中文。运行后在浏览器中显示如图所示浏览器
缘由在于没有在JSP中指定页面显示的编码,消除乱码的解决方案很简单上面代码中page命令修改为以下所示便可服务器
<%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %> <html> <head> <title>中文显示示例</title> </head> <body> 这是一个中文显示示例: <% String str = "中文"; out.print(str); %> </body> </html>
再次运行乱码消失,原理就是向页面指定编码为GB2312,那么页面就会按照此编码来显示,因而乱码消失。eclipse
2、URL传递参数中文乱码jsp
通常状况下在使用get方法提交表单的时候传递的参数若是是中文的话极可能会出现乱码。编辑器
下面是一个示例程序post
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> <html> <head> <title>URL传递参数中文处理示例</title> </head> <% String param = request.getParameter("param"); %> <body> <a href="URLCharset.jsp?param='中文'">请点击这个连接</a><br> 你提交的参数为:<%=param%> </body> </html>
上面这个JSP程序的功能就是经过一个URL连接向自身传递一个参数,这个参数是中文字符串,这个程序的运行效果以下图
对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,须要修改Tomcat服务器的配置文件才能解决问题。在这里修改Tomcat的conf目录下的server.xml配置文件,具体改后的代码以下
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="gb2312" connectionTimeout="20000" redirectPort="8443" />
在原来代码中添加URI编码设置URIEncoding=“gb2312”便可,重启Tomcat服务器能够获得正确的页面。其原理也和上面的状况相似,就是向程序指明编码类型,而后显示就正常了。
3、表单提交中文乱码
对于表单的数据可使用request.getParameter(“”)的方法获取,可是当表单中出现中文数据的时候就会出现乱码。
示例代码以下
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> <html> <head> <title>Form中文处理示例</title> </head> <body> <font size="2"> 下面是表单内容: <form action="AcceptFormCharset.jsp" method="post"> 用户名:<input type="text" name="userName" size="10"/> 密 码:<input type="password" name="password" size="10"/> <input type="submit" value="提交"> </form> </font> </body> </html>
在上面的表单当中想AcceptFormCharset这个页面提价两项数据,下面是AcceptFormCharset.jsp的内容:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> <html> <head> <title>Form中文乱码</title> </head> <body> <font size="2"> 下面是表单提交之后用request取到的表单数据:<br> <% String userName = request.getParameter("userName"); String password = request.getParameter("password"); out.println("表单输入userName的值:" + userName + "<br>"); out.println("表单输入password的值:" + password + "<br>"); %> </font> </body> </html>
在上面的程序中,若是表单输入没有中文,则能够正常的显示当输入的数据中有中文的时候,获得的结果如图所示。
产生种结果的缘由是Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。对于这个问题能够采用转换编码格式的方法来解决,如今对AcceptFromCharset这个页面改动以下:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> <html> <head> <title>Form中文乱码</title> </head> <body> <font size="2"> 下面是表单提交之后用request取到的表单数据:<br> <% String userName = request.getParameter("userName"); String password = request.getParameter("password"); out.println("表单输入userName的值:" + new String(userName.getBytes("ISO-8859-1"), "gb2312")+ "<br>"); out.println("表单输入password的值:" + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "<br>"); %> </font> </body> </html>
通过这样的转换编码之后,全部的中文输入均可以用request对象正常取出。在上面这个程序中,第四行和第五行是转换编码格式的关键,先从ISO-8859-1格式的字符串中取出字节内容,而后在用GB2312的编码格式从新构造一个新的字符串。这样就能够支持中文变淡输入的正常取值和显示。改进之后程序运行结果以下
通过上面的更改编码格式的处理,表单的中文输入乱码问题已经获得解决。可是若是上面的表单中的输入项不止是两个,那么每一个输入项都须要进行编码转换,那样就很麻烦了。这是咱们就用到了大名鼎鼎的过滤器filter了。关于这里的内容大体的思虑和上面的同样具体作法请参照笔者的另外一篇文章。
4、Eclipse中JSP文件中文乱码
在Eclipse或者MyEclipse中因为默认的JSP编码格式为ISO-8859-1,因此当打开由其余编辑器编辑的JSP文件时会出现乱码,如图所示
对于这个问题咱们只须要更改一下Eclipse或者是MyEclipse中对JSP的默认编码就能够了,修改的地方(个人MyEclipse版本为11)如图所示
PS
在Eclipse或者MyEclipse当中JSP文件默认的编码为ISO-8859-1,因此在JSP代码中间若是出现中文就不能保存,例如以下代码
<%@ page language="java" import="java.util.*" %> <html> <head> <title>中文显示示例</title> </head> <body> 这是一个中文显示示例: <% String str = "中文"; out.print(str); %> </body> </html>
修改后在保存的时候会提示以下:
现这个提示的缘由在于JSP源文件中有ISO=8859-1编码没法识别的中文字符,对于这个问题,解决办法就是在JSP页面中声明页面编码格式便可。声明后代码以下:
<%@ page language="java" import="java.util.*" pageEncoding="GB2312" %> <html> <head> <title>中文显示示例</title> </head> <body> 这是一个中文显示示例: <% String str = "中文"; out.print(str); %> </body> </html>
其中第一行中pageEncoding=“gb2312”指明了JSP页面编码采用GB2312,这样就能够正常保存JSP的源文件了。
遇到问题首先分析问题出现的缘由,只有知道了缘由才能去解决,学习分析问题的来源远比解决这个问题重要的多。
乱码问题的缘由就是程序(Eclipse也好,浏览器也罢)的编码没有和编程人员的编码进行统一,(就像你和一个不懂中文的人用中文交流他固然不懂了)那么解决这个问题只须要将编程人员想要的编码告诉程序就能够了,以上解决乱码问题的种种方法均可以说是一种声明编码的过程,也就是说乱码问题终极解决方案就是:转码。这里的转码要么是编程人员手动转,要么就是声明一下让程序去转,换句话说就是:和不懂中文的交流,要么让他学中文,要么你就去学习他的语言。
生活就是编程,编程就是生活,同之,通之!!!