谈论MySQL与JSP中文乱码问题的解决方案
引用
MySQL与JSP中文乱码问题的解决方案
今天晚上把MySQL和JSP的中文乱码问题弄了一下。的确要花点时间,参考了不少文章,加上JSP熟悉一点,所以基本顺利,而且把整个原理也搞得比较清楚了。这里写一点经验之谈,让同行们做个参考,同时有不足之处,欢迎指教。首先我把问题归结为两个方面:1.从MySQL数据库中取出中文数据,输出到JSP页面上产生的乱码。2.从JSP页面的表单输入数据,提交(Submit)后,写到数据库中,然后再从数据库中取出,输出到JSP页面时产生乱码。先来看第一个问题,因为数据库中取出的字符编码是ISO-8859-1(这是大多数数据库使用的传送字符集),而在JSP页面中要使用的中文字符编码是GB2312或GBK(GBK是对GB2312向上兼容的扩展,所包括的中文字符更多,我这里选用了GBK,要注意的是,选用了GBK就要统一使用,不要用GB2312或其他了,否则也有可能乱码),因此必须要对其进行转换,两个基本方法如下://将iso-8859-1编码的字符串转换为GBK编码的字符串,这个方法用来解决第一个问题new String(isoStr.getBytes("iso-8859-1"), "gbk");//将GBK编码的字符串转换为iso-8859-1编码的字符串,这个方法是为了解决第二个问题new String(gbkStr.getBytes("gbk"), "iso-8859-1");我的一般做法是把这两个方法写在一个JavaBean里,JavaBean是什么在这里我就不多说了。相信很多做过JSP的朋友都知道,具体代码如下:import java.io.UnsupportedEncodingException;public class StringConvertor {
//convert the GBK String to ISO String,return ISO String
public static String GbkToIso(String gbkStr)
throws UnsupportedEncodingException {
return new String(gbkStr.getBytes("gbk"), "iso-8859-1");
}
//convert the ISO String to GBK String,return GBK String
public static String IsoToGbk(String isoStr) throws UnsupportedEncodingException {
return new String(isoStr.getBytes("iso-8859-1"), "gbk");
}}在JSP页面中代码的用法:假定你从数据库中取出的String现在是str(还没有进行转换哦)那要输出到页面的时候就这样写: <%=convertor.IsoToGbk(str)%>这里的convertor是我所建立的Javabean如果你不想建立JavaBean,就这样写:new String(str.getBytes("iso-8859-1"), "gbk");但是不要忘记在页面的最上面包含<%@ page import="java.io.*" %>因为要用到这个包,否则会出错。不过还是建议大家使用JavaBean的好,一般都是这样做的。这样应该就可以解决第一个问题了。要解决第二个问题,首先就是你的连接数据库的URL要变成这样:jdbc:mysql://localhost:3306/dbName?useUnicode=true&characterEncoding=utf8这里dbName是你的数据库的名字因为utf8是支持多国语言传送的,所以一定要使用改字符集连接你的数据库。光这样还不行,请在每一个JSP页面的头上加这样两个语句:<%@ page contentType="text/html; charset=gbk"%>
<%request.setCharacterEncoding("GBK");%>第一个语句表示页面内容使用GBK字符集,这是为了页面显示正确的字符第二个语句是表示提交表单的时候,以GBK字符集编码形式进行提交,这两个是必须的,否则会出错。接着就是数据转换,因为JSP页面上的字符集是GBK或GB2312的中文,就用刚才说的第二个方法跟第一个差不多,把GBK的字符串转成ISO-8859-1的字符串,你可以把整个SQL语句进行转换,也可以只转换那个是中文的String,再组合到SQL语句中,然后写到数据库中去。好了,至此,万事ok,打开你的Tomcat服务器和MySQL服务器进行测试吧。Good Luck!^_^总结JSP中文乱码涉及很多方面,比如数据库服务器,web服务器,操作系统等等,很难一一例举。但是其核心就是字符编码的问题,只要统一所使用的字符编码,大多问题都能迎刃而解。也许这里也有说的不对的地方,敬请大家指教,具体问题也欢迎大家来讨论。