硅谷网12月25日讯 中文乱码是JSP动态网站开发中经常遇到的问题,本文从字符编码介绍、JSP页面显示乱码处理、JSP表单传递过程中出现乱码处理、读写数据库出现乱码处理进行了研究和探讨,并给出了乱码处理的解决方案。
Java具有跨平台特性,很多公司将Java作为软件开发的首选语言,在软件开发中被广泛使用。JSP(JavaServerPages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准。使用JSP能建立与平台无关、功能强大的Web网站,是目前很受欢迎的一种开发动态网站的应用程序。在基于JSP的动态网站开发过程中,由于使用的操作系统、浏览器以及数据库所使用的编码方式不同,对中文的支持也不相同,中文乱码问题经常困扰着程序开发人员,下面就中文乱码的几种问题进行探讨,并给出解决办法。
JSP中出现的中文乱码主要可以归纳为:JSP页面显示乱码、表单传递过程中出现乱码、读写数据库出现乱码。
一、字符编码介绍
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。各种语言可建立与Unicode的映射关系,Unicode支持相互转换、处理和显示不同语言,Java也是基于这一点实现了不同语言的转换。
UTF,是UnicodeTextFormat的缩写,意为Unicode文本格式。是在Unicode定长编码的基础上产生的不定长编码,用1-6个字节编码。UTF编码带简单校验功能,同时方便了网络数据传输。
GBK即汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号,21003个汉字及提供了1894个造字码位。GB2312是中华人民共和国国家标准汉字信息交换用码,简称国标码。GBK能表示简体字和繁体字,而GB2312只表示简体字,GBK兼容GB2312编码。
二、JSP页面显示乱码处理
1.如果是JSP页面,由于JSP采用ISO8859-1(一种定长单字节字符集,不能识别中文)作为默认页面字符编码,可在JSP文件的开头部分使用page指令指定JSP页面字符编码为GB2312或者GBK。当JSP文件被编译时,中文字符将从GB2312或GBK格式向Unicode格式转换,而不是从所用的操作系统的file.encoding格式转换为Unicode,这样就避免了乱码的出现。代码如下:<%@pagecontentType="text/html;charset=gb2312"%>。
2.如果是Servlet页面,可以调用response的setContentType()方法,代码如下:response.setContentType("text/html;charset=gb2312")。
3.如果是HTML页面,可在HTML页面头部加入如下代码:<Metahttp-equiv="Content-Type"Content="text/html;Charset=gb2312">,以避免中文乱码的出现。
三、JSP表单传递过程中出现乱码处理
1.JSP页面采用表单提交时,如果使用request.getParameter()得到String类型数据,其编码方式为ISO8859-1,提交数据含有中文,获取数据后,返回的如果是乱码,可以在标记<html>之前,加<%request.setCharacterEncoding("GBK")%>。该方法适用于表单以post方式提交参数,对get方式不起作用。
2.对接受到的参数进行编码转换。使用request.getParameter()方法获取中文参数之后,用getBytes()方法进行编码转换,使中文正确显示,代码如下:
Stringname=request.getParameter("uname");
Stringname1=newString(name.getBytes("ISO-8859-1"),"GBK");
3.修改配置文件server.xml,找到含有port="8080"的Connector区块,在最后加上:URIEncoding="GBK"。然后重启tomcat。
4.如果页面较多,可以用过滤器解决,首先建一个过滤器类filter,代码如下:
packagecn.wfec.www.filter;
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
publicclassEncodingFilterimplementsFilter{
publicvoiddestroy(){}
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
FilterChainarg2)throwsIOException,ServletException{
arg0.setCharacterEncoding("GBK");
arg2.doFilter(arg0,arg1);
}
publicvoidinit(FilterConfigarg0)throwsServletException{}
}
之后在web.xml中添加如下代码:
<filter>
<filter-name>encoding</filter-name>
<filter-class>cn.wfec.www.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
四、读写数据库出现乱码处理
如果在JSP开发中使用MySQLServer数据库,在数据库读写过程中容易出现乱码,可以将数据库默认支持的编码格式直接改为GBK或者GB2312。在安装目录下找到my.ini文件,在[client]区设置:default-character-set=GBK,在[mysqld]区设置:default-character-set=GBK。修改后,数据库默认支持的编码格式修改成为中文编码,这样解决了使用MySQLServer数据库出现的乱码问题。如果在开发中使用SQLServer,将数据库默认语言设置为SimplifiedChinese即可。
如果在读MySQL数据库时中文出现乱码,可在连接数据库时,在url后加:"?useUnicode=true&characterEncoding=GBK"。因为采用JDBC驱动,在程序和数据库间传递数据是以ISO8859-1为默认编码格式,从而导致乱码的产生。
如果在写MySQL数据库时中文出现乱码,可在ISO8859-1格式的数据写入数据库之前,转换为中文编码格式。在执行写数据库操作的前一句写入代码:Stringstr1=newString(str.toString().getBytes("8859_1"),"GBK");
五、结束语
在基于JSP的网站开发过程中,中文乱码问题并不难解决。如果出现中文乱码,要认真分析原因,多做试验,才能有效地解决中文乱码问题。
|
|