搜档网
当前位置:搜档网 › JSP中文乱码问题完全解决方案

JSP中文乱码问题完全解决方案

JSP中文乱码问题完全解决方案


在JSP开发过程中会遇到各种中文乱码问题,对乱码的处理方法也有所不同!究其原因.大部分是因为编码默认采用ISO-8859-1或者是编码不一致导致的,悲剧的是默认的ISO-8859-1编码不支持中文!(唉,中国...感慨一下,不解释)所幸,UTF-8,GBK,GB2312都是支持中文的!
(造成这种问题的根本原因是Java中采用的默认编码方式为Unicode,而中文的编码方式一般情况下为GB2312,因为编码格式的不同,从而导致中文不能正常显示。对于中文乱码问题,在不同的JDK版本和不同的应用服务器中的处理方法是不同的。但是其本质上都是一样的,就是把中文字符转化成合适的编码方式,或者是在显示中文的环境中声明采用GB2312的编码。统一编码方案之后自然可以正常显示。)

一. JSP页面中文乱码
(包括HTML中的中文乱码及在JSP中动态输出的中文乱码)
这种乱码最常见也最好解决

解决方法: 在page指令中添加页面内容和显示方式的设置,如下两种都可以:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page language="java" import="java.util.*" ContentType="text/html;charset=gb2312"%>
有人会问pageEncoding和ContentType有什么区别,简单说
contentType指定的是JSP页最终 Browser(客户端)所见到的网页内容的编码
pageEncoding指定JSP编写时所用的编码
(注意先检查源文件jsp中中文是否正常显示,再做判断)
如果是浏览器端显示乱码,设置ContentType里的charset;
如果是JSP页面不能正常保存,设置pageEncoding即可


二. URL传递中文参数乱码

URL传递中文参数乱码比较特殊,仅仅转换这个中文字符串的编码或者设置JSP页面显示编码都不能解决这个问题!必须对服务器的配置文件进行修改,这里针对Tomcat的配置文件进行修改,具体如下:

打开tomcat的conf目录下的server.xml配置文件,找到

在port="8080"后面添加URL编码设置URIEncoding="gb2312" 重启服务器即可.


三. 表单提交中文乱码

表单中输入的中文数据在用request取出以后全部变成了乱码,造成这个问题的原因是: 在Tomcat中,对于以POST方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。对于这个问题可以采用转换编码格式的方法来解决。例如:new String(userName.getBytes("ISO-8859-1","gb2312"),这种转码方式要求原来的userName编码格式为ISO-8859-1,否则无效。
对于表单中提交的中文数据乱码可以用转码方式解决(适合单一表单),也可以用过滤器filter解决(适合多表单),

个人推荐用过滤器,一了百了,当然采取哪种方法由你来决定!
过滤器的基本原理就是对于每一个用户请求,都必须经过过滤器的处理才能继续发送到目的页面中。在JSP中,以POST方式提交的表单在本质上就是封装在request对象中的,而request对象是必须要经过过滤器的处理的,所以对于表单的中文问题来说,可以在filter中对所有的请求进行编码格式的处理,这样就不必在每个表单中都进行转码处理,节省大量的时间和精力。

中文处理过滤器
注:此方法仅限提交方法为doPost,对于doGet方法可以用转码

文件名:SetCharacterEncodingFilter.java

package filters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;

public class SetCharacterEncodingFilter implements Filter {
protected FilterConfig filterConfig;
protected String encodingName;
protected boolean enable;

public SetCharacterEncodingFilter() {
this.encodingName = "gb2312";
this.enable = false;
}

public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
loadConfigParams();
}

private void loadConfigParams() {
this.encodingName = this.filterConfig.getInitParameter("encoding");
String strIgnoreFlag = this.filterConfig.getInitParameter("enable");
if (strIgnoreFlag.equalsIgnoreCase("true")) {
this.enable = true;
} else {
this.enable = false;
}
}

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
if (this.enable) {
request.setCharacterEncoding(this.encodingName);
}
chain.doFilter(request, response);
}

public void destroy() {
}

}

在web.xml中添加过滤器的配置如下:


SetCharacterEncoding
filters.SetCharacterEncodingFilter

encoding
gb2312


enable
true



SetCharacterEncoding
/*


经过这个字符编码格式转换过滤器的处理,所有来自客户的请求数据都被转换成gb2312的格式,这样就可以解决中文编码格式不同带来的乱码问题,这里需要注意,在Tomcat中,对URL和GET方法提交的表单是按照ISO-8859-1的格式

进行编码的,过滤器对这种情况并不起作用,这时就需要修改Tomcat的配置文件来解决。


四. 数据库操作中文乱码
在建立数据库的时候,应该选择支持中文的编码格式,最好能和JSP页面的编码格式保持一致,这样就可以尽可能减少数据库操作的中文乱码问题。同时在JDBC连接数据库的时候可以使用类似下面这种形式的URL。jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs;useUnicode=true;characterEncoding=gb2312
在上面这行代码中,指定了访问数据所使用的编码策略。在这里我们选择的数据库驱动程序为微软公司提供的官方驱动,连接的数据库为SQL Server 2000自带的pubs数据库,选择的编码为gb2312。
上面所说的方法仅仅适用于创建数据库的时候已经选择支持中文的编码,但是当一个数据库已经创建,而且编码格式已经是ISO-8859-1的时候,这种情况下通过重新创建数据库显然是不现实的,尤其是当数据库中已经有大量数据时,这时候用上面介绍的方法可以正常向数据库中写入中文数据,但是读出的数据格式是ISO-8859-1,如果有中文内容,就会显示乱码。这时只有在读取数据库的时候进行转码,使用的方法还是前面提到的转码方法,在这里把它整理成一个转码的函数。
public String encoder(String str)throws UnsupportedEncodingException {
String result=new String(str.getBytes("ISO-8859-1"),"gb2312");
return result;
}
有了这个转码函数,在读取数据库的时候就可以使用encoder(rs.getString("列名")),这样取得中文字符串的内容就可以正常显示了。


五. Eclipse开发工具中JSP文件中文不能保存(保存JSP的源文件)
在Eclipse中,JSP文件默认的编码格式为ISO-8859-1,所以在JSP代码中间如果出现中文就不能保存。对于这个问题,只要在JSP页面中指明页面编码即可。<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>


六. Eclipse开发工具中中文显示乱码
产生原因:在Eclipse中对JSP文件的保存方式为ISO-8859-1,这种编码格式对中文不支持。
在Eclipse中,由于默认的JSP编码格式为ISO-8859-1,所以当打开由其他编辑器编辑的JSP页面就会出现乱码。造成这个问题的原因是不同编辑器保存源文件的编码格式不同,解决方法是更改Eclipse默认的编码方案。
操作步骤:在Eclipse菜单中选择Window|Preference命令,在打开的窗口中选择General|Content Types 选择Text|JSP, Default encoding改为GB2312,单击Update按钮更新设置,重启Eclipse即可正常显示中文。


七. JSP下载中文文件名乱码
在实现文件下载功能的时候,如果出现中文文件名,如果不进行特殊的处理,下载下来的中文文件名会变成乱码,在下载前,就

需要对这个文件名进行处理,然后才能正常显示中文的文件名,具体处理方法示例如下。
//--------------------文件名:FileNameCharset.jsp-------------------
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page import="java.io.*" %>
<%
String fname = "中文";
OutputStream os = response.getOutputStream();//取得输出流
response.reset();//清空输出流

//下面是对中文文件名的处理
response.setCharacterEncoding("UTF-8");
fname = https://www.sodocs.net/doc/d8535550.html,.URLEncoder.encode(fname, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename="+ new String(fname.getBytes("UTF-8"), "gb2312") + ".xls");
response.setContentType("application/msexcel");//定义输出类型
os.close();

%>




经过上面的处理,下载下来的中文文件名称就可以正常显示。

总之,在JSP中出现中文乱码的问题,在不同的服务器中有不同的原因,但最根本的原因都是相通的,那就是编码格式的冲突,只要知道使用的服务器采用的编码格式,然后再根据这个编码格式把中文字符串转码即可。

相关主题