关于JSP读写MySQL数据库的中文问题的测试
测试代码:
1、 检测WEB服务器端当前语言设置:
String srcEncoding = java.lang.System.getProperty("file.encoding");
out.print(srcEncoding);
获取JSP运行时所在的电脑(即WEB服务器)系统的file.encoding属性可查出系统当前的语言设置。
这一步获得的语言设置值,在后面的测试记录表中,称为“语言检测值”。
2、 设置向客户端输出的字符集:
<%@page contentType="text/html;charset=GB2312"%>(斜体部分可替换为BIG5或GBK,下同)
这里的GB2312或BIG5或GBK,在后面的测试记录表中,称为“网页字符集”。
3、 将用户的输入转换为目标字符集:
JSP中:
引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
转换输入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
Bean中:
转换函数convertStr代码:
public String convertStr(String str, String FromEncoding, String ToEncoding) throws UnsupportedEncodingException
{
String temp_src = str;
byte[] temp_mid = temp_src.getBytes(FromEncoding);
String temp_dst = new String(temp_mid, ToEncoding);
return temp_dst;
}
4、 显示中文内容:
转换字符集后显示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
不转换字符集即显示:<%=rs.getString("Name")%>
...测试总结:
1、 最简单通用的中文字符处理方案如下:
对简体中文系统:
1) Windows2000或Redhat Linux7.0 WEB服务器端内核置为简体中文,Redhat Linux7.0 WEB服务器还可置为英文;
2) 网页字符集设为简体中文;
3) 将输入内容转换为简体中文存储;
4) 输出时不作字符集转换。
对繁体中文系统,将上述简体中文系统处理方案中的简体中文替换为繁体中文即可。
英文Windows2000服务器,可安装(免费?)多语言包,即可使用简体或繁体内核。
注:目前只能将中文内容以POST方式提交,尚未解决以GET方式提交中文参数的问题。
2、 GBK字符集对GB2312支持很好,但对Big5支持并不完全,因此,不建议使用GBK作为网页字符集,而对简体中文与繁体中文系统分别使用GB2312与Big5字符集
********************************************************************
* 解决中文问题,ISO转为GBK编码,用于POST,GET方式取得数据
* @param str 原始文本
* @return 转码后的文本
*/
public String iso2gb(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("ISO8859_1");
}
catch (UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.iso2gb :"+e.getMessage());
}
try {
str=new String(tmpbyte,"GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
/**
* 解决中文问题,GBK转ISO编码,用于从数据库中存入转码
* @param str 原始文本
* @return 转换后文本
*/
public String gb2iso(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
try {
str=new String(tmpbyte,"ISO8859_1");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
通过测试,学习,再测试,再学习,我觉得自己有必要总结一下,有说的不对的地方请大家指正,另外某些专业性分析可能来自别的大虾的贴子。
1.运行环境:
Win2000(经查,当前语言设置为GBK)
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13(数据库的字符集设为none)
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar
2.出现的问题:读写Mysql数据库出现乱码(或????问号)
a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是中文输 出就是乱码了。
3.分析
我们所用到的数据库读写操作都是在Java环境下完成的,JAVA 语言默认采用Unicode处理字符。
Mysql和Java之间兼容的似乎很好,
这就是为什么如果我们不对Jsp的输出字符集做任何修改(如加上charset=gb2312),则Mysql数据库的读写都应该没问题(如上述的a情况)的原因(只是读出的中文输出为乱码)。
这一点在Access2000上反而没有任何问题,看来是Access2000对GBK(gb2312)编码的支持比较好。
如果朋友们在Mysql的读写数据库中遇到问题,可以试试如下方法:
(以下方法参照umljsp(夜未央天未白)给出的iso2gb()和gb2iso()方法)
方法1:
1.连接数据库 "jdbc:mysql://localhost/book?user=root"
2.读数据库 不需要转码
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
方法2:
1.连接数据库 jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
2.读数据库 执行iso2gb(String str)方法。具体参考此方法的实现
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
从上面看似乎方法2的形式更对称一些,不过在以后免不了要多写一个转换编码的函数,从页面上看好像是不太舒服,不知大虾们有没有完美的解决方法?