您的位置:首页 > 数据库 > MySQL

[zz]谈论MySQL与JSP中文乱码问题的解决方案

2008-07-29 23:06 369 查看

谈论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服务器,操作系统等等,很难一一例举。
但是其核心就是字符编码的问题,只要统一所使用的字符编码,大多问题都能迎刃而解。
也许这里也有说的不对的地方,敬请大家指教,具体问题也欢迎大家来讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: