JSP中文乱码问题终极解决方案

 时间:2013-04-06 13:59:42 贡献者:caiyuekan

导读:JSP 中文乱码问题终极解决方案在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客 当中论述的 JSP 中文乱码问题有如下几个方面:页面乱码、参数乱码、表 单乱码、源文件

JSP 中文乱码问题终极解决方案在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客 当中论述的 JSP 中文乱码问题有如下几个方面:页面乱码、参数乱码、表 单乱码、源文件乱码。

下面来逐一解决其中的乱码问题。

一、JSP 页面中文乱码 在 JSP 页面中,中文显示乱码有两种情况:一种是 HTML 中的中文乱 码,另一种是在 JSP 中动态输出的中文乱码。

先看一个 JSP 程序:<%@ page language="java" import="java.util.*" %> 中文显示示例 这是一个中文显示示例: <% String str = "中文"; out.print(str); %> 上面这个 JSP 程序看起来好像是在页面显示几句中文而且标题也是中 文。

运行后在浏览器中显示如图所示原因在于没有在 JSP 中指定页面显示的编码,消除乱码的解决方案很简 单上面代码中 page 命令修改成如下所示即可

<%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %> 中文显示示例 这是一个中文显示示例: <% String str = "中文"; out.print(str); %> 再次运行乱码消失,原理就是向页面指定编码为 GB2312,那么页面 就会按照此编码来显示,于是乱码消失。

二、URL 传递参数中文乱码 一般情况下在使用 get 方法提交表单的时候传递的参数如果是中文的 话很可能会出现乱码。

下面是一个示例程序<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> URL 传递参数中文处理示例 <% String param = request.getParameter("param"); %> 请点击这个链接
你提交的参数为:<%=param%>

上面这个 JSP 程序的功能就是通过一个 URL 链接向自身传递一个参 数,这个参数是中文字符串,这个程序的运行效果如下图对于 URL 传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转 换这个中文字符串或者设置 JSP 页面显示编码都是不能解决问题的,需要 修改 Tomcat 服务器的配置文件才能解决问题。

在这里修改 Tomcat 的 conf 目录下的 server.xml 配置文件,具体改后的代码如下在原来代码中添加 URI 编码设置 URIEncoding=“gb2312”即可,重 启 Tomcat 服务器可以得到正确的页面。

其原理也和上面的情况类似,就 是向程序指明编码类型,然后显示就正常了。

三、表单提交中文乱码 对于表单的数据可以使用 request.getParameter(“”)的方法获取, 但是当表单中出现中文数据的时候就会出现乱码。

示例代码如下<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> Form 中文处理示例 下面是表单内容:

用户名: 密 码:
在上面的表单当中想 AcceptFormCharset 这个页面提价两项数据,下面是 AcceptFormCharset.jsp 的内容:<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> Form 中文乱码 下面是表单提交以后用 request 取到的表单数据:
<% String userName = request.getParameter("userName"); String password = request.getParameter("password"); out.println("表单输入 userName 的值:" + userName + "
"); out.println("表单输入 password 的值:" + password + "
"); %>

在上面的程序中,如果表单输入没有中文,则可以正常的显示当输入 的数据中有中文的时候,得到的结果如图所示。

产生种结果的原因是 Tomcat 中对于 post 方法提交的表单采用的默认 编码为 ISO-8859-1,而这种编码格式不支持中文字符。

对于这个问题可以 采用转换编码格式的方法来解决,现在对 AcceptFromCharset 这个页面改 动如下:<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%> Form 中文乱码 下面是表单提交以后用 request 取到的表单数据:
<% String userName = request.getParameter("userName"); String password = request.getParameter("password"); out.println("表单输入 userName 的值:" + new String(userName.getBytes("ISO-8859-1"), "gb2312")+ "
"); out.println("表单输入 password 的值:" + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "
"); %>

经过这样的转换编码以后,所有的中文输入都可以用 request 对象正 常取出。

在上面这个程序中,第四行和第五行是转换编码格式的关键,先 从 ISO-8859-1 格式的字符串中取出字节内容, 然后在用 GB2312 的编码格 式重新构造一个新的字符串。

这样就可以支持中文变淡输入的正常取值和 显示。

改进以后程序运行结果如下经过上面的更改编码格式的处理,表单的中文输入乱码问题已经得到 解决。

但是如果上面的表单中的输入项不止是两个,那么每个输入项都需 要进行编码转换,那样就很麻烦了。

这是我们就用到了大名鼎鼎的过滤器 filter 了。

关于这里的内容大致的思虑和上面的一样具体做法请参照笔者的 另一篇文章。

四、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.*" %> 中文显示示例 这是一个中文显示示例: <% String str = "中文"; out.print(str); %> 修改后在保存的时候会提示如下:现这个提示的原因在于 JSP 源文件中有 ISO=8859-1 编码无法识别的 中文字符,对于这个问题,解决办法就是在 JSP 页面中声明页面编码格式 即可。

声明后代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="GB2312" %> 中文显示示例 这是一个中文显示示例: <% String str = "中文"; out.print(str); %> 其中第一行中 pageEncoding=“gb2312”指明了 JSP 页面编码采用 GB2312,这样就可以正常保存 JSP 的源文件了。

遇到问题首先分析问题出现的原因,只有知道了原因才能去解决,学 习分析问题的来源远比解决这个问题重要的多。

乱码问题的原因就是程序(Eclipse 也好,浏览器也罢)的编码没有和 编程人员的编码进行统一,(就像你和一个不懂中文的人用中文交流他当 然不懂了)那么解决这个问题只需要将编程人员想要的编码告诉程序就可 以了,以上解决乱码问题的种种方法都可以说是一种声明编码的过程,也 就是说乱码问题终极解决方案就是:转码。

这里的转码要么是编程人员手 动转,要么就是声明一下让程序去转,换句话说就是:和不懂中文的交流, 要么让他学中文,要么你就去学习他的语言。

生活就是编程,编程就是生活,同之,通之!!

 
 

微信关注公众号,送福利!