java learnging

一块探讨JAVA的奥妙吧
posts - 34, comments - 27, trackbacks - 0, articles - 22

关于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;
  }


 

下面是对上面所说的一个回帖:

经过我的多次测试,只有umljsp(夜未央天未白)的方法能够解决我这里发生的问题(也许每个人的开发环境有差异而引起解决方法的不同)。
感谢所有提建议给我的朋友!非常感谢!
通过测试,学习,再测试,再学习,我觉得自己有必要总结一下,有说的不对的地方请大家指正,另外某些专业性分析可能来自别的大虾的贴子。

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的形式更对称一些,不过在以后免不了要多写一个转换编码的函数,从页面上看好像是不太舒服,不知大虾们有没有完美的解决方法?


只有注册用户登录后才能发表评论。


网站导航: