JAVA 字符乱码问题处理经验

王佳亮

JAVA 字符乱码问题处理经验
 
一、问题背景
 
    同事这边做了一个小型的数据导入导出软件。编程环境为Eclipse,JDK版本为1.5,数据库使用的是MySql5.0。
软件的基本流程如下:
1、将文本文件中的数据按照一定的截取格式,导入到数据库中。
2、将导入数据库中的数据,导出为Excel文件。
 
    看似一点也不复杂。导入非中文数据,一切正常。但是,如果文本文件中,包含中文,则中文部分为‘?’问号。考虑到是字符编码格式不统一,于是采取如下操作:
1、查看 MySql 的字符设置。发现是latin1。其实latin1也是支持中文的。在数据库中直接插入数据,中文显示正确。Eclipse环境为‘GBK’,为了统一,将数据库设置为‘GB2312’,运行程序。导入的数据仍然是乱码。
2、为了统一所有字符编码,将文本数据文件改为UTF-8,将编程环境改为UTF-8,将数据库字符集改为UTF-8。目前所有格式都统一,因该不会出现乱码。运行程序,发现在运行时,还未导入数据库,就出错。程序终止。
 
二、处理过程
 
1、用C#做了一个小程序,用于检验文本数据文件的编码,发现是”System.Text.DBCSCodePageEncoding”,网上查了些资料,介绍这种字符的不多。尝试用ASCIIUnicode,UTF-8,UTF-7,格式读取文件,均为乱码。最后用Encoding.Default ,来读取数据,显示正常。
会不会是程序在读取文件时,就已经是乱码了呢?而不是导入数据库才出的问题。带着这个疑问,在取数据时,用 System.out.println 输出验证了一下,发现果然如此。读取数据程序,是将文本数据中的每一行按某个标志位拆分,放入到数组中。与是,我做了一个字符转换,不是转换整个文件(因为转换整个文件,之前尝试会导致截取Byts出错)。于是,我在取文件时,还是按原文件编码去取,将截取后的字符串,读入数组后,我在做转换。
见如下程序:
     str = str.substring(0,str.lastIndexOf(ConstDef.SEP));//原程序
     //System.out.println(str);
     byte[] tempByte = str.getBytes("GBK");
     String a = new String(tempByte,"GB18030");
     //System.out.println(a);
 str = a;
 
这时,再用System.out.println输出转换后的程序,发现中文能正常显示。
 
2、但是,传入到数据库中的值,中文还是乱码。接下来就好办了,数据库用的是latin1,可以和ISO8859-1兼容。于是,在将读取数组后,存入MySql的过程数据,转换为 ISO8859-1
见以下程序:
    String a = null;
       byte[] tempByte = null;
      
       try
        {
           tempByte = string.getBytes("GB18030");
           a = new String(tempByte,"iso8859-1");
       } catch (UnsupportedEncodingException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
    }
 
    System.out.println 输出-         System.out.println(stmt.toString());
 
发现插入的字符带有问号“?”,但在数据库中查看,发现已经是中文,离成功又更近了一步。
 
这里的中文为?”问号,是由于编程环境(GBK)与转换的字符不统一的原因。
 
 
    PreparedStatement stmt = null;
       try {
           stmt = conn.prepareStatement(sql);       
           //System.out.println(stmt.toString());
           retVal = stmt.executeUpdate();
       } catch (SQLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } finally
        {
           try {if(null!=stmt) stmt.close();}catch(Exception e){}
    }
 
3、数据库查看,中文已经能正常显示,但是导出的Excel 文件,中文仍然是乱码。问题还是出在字符编码问题上。在做一次转换。把从数据库中拿出的数据,由ISO8859-1转换为:"GB18030"查看导出的Excel文件,中文显示正常。
 
4、中文字符乱码问题解决。
 
三、经验
 
1、有时将整个文件做字符转换,虽然容易,但是在某些时候不可行。必要情况下,要把原数据文件按原数据编码读出,逐条转换。
2、在理论的基础上,多加实践,受益匪浅。