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”,网上查了些资料,介绍这种字符的不多。尝试用ASCII、Unicode,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、在理论的基础上,多加实践,受益匪浅。