JDBF不能读取中文问题的解决方法
2013-04-11 15:48
375 查看
JDBF对于数据的读取采用了UNICODE字符集,所以读取数据的时候不存在问题。关键在于对字段的读取不兼容中文。
打开JDBF的源码就知道,它是把.dbf作为文件流的形式读进来的,但是我不明白它为什么读取字段和读取数据要分两种方式。读取字段的时候它是这样的:从文件流中一个一个byte(字节)地读取信息,却画蛇添足地把每个字节强行转化为字符(char)型,然后再把这一传char拼接成一个String字段。
这样就有问题了,在JAVA中一个char的大小是一个byte的两倍,这样的话,就相当于每个char的高位填入了一个为0000的空byte,对于使用高位的中文字符集来说,它就相当于每次读取了半个中文字符,然后就把这半个字符用补零的方法转换成整个中文字符,这就是JDBF不能读取中文字段名的原因。(所幸的是它在读取数据的时候却没有采用逐个byte读取的方式,所以不会出现问题。)
还有一点幸运的是,它读进来的字段虽然是错的,但是字段里面所含的信息没有丢失,我们只要把它人为填加的0000空byte去掉就可以转回真正的中文。
知道了原因,就很好解决了,下面是我写的一个转换函数,你在通过String columnName=DBFReader.getField(i).getName()得到每一个字段的时候使用这个函数转换,就可以转回正确的汉字。
//遍历字串的每一个char,转换成byte后组合成byte[],再转换成String返回
//****可以解决因逐个读入char(而不是byte)而组成的字串不能通过encoding还原成中文的问题****
public String getStrByCharToByte(String str) {
byte[] temp = new byte[str.length()];
for (int i = 0; i < str.length(); i++) {
temp[i] = (byte) (str.charAt(i));
}
return new String(temp);
}
相关文章推荐
- sqlite3导库方法与wxsqlite3不能读取中文的问题解决
- MFC用CStdioFile类读取中文文本时乱码问题的一种解决方法
- php 读取xml的方法 (iconv解决中文乱码问题)
- VS2005中fstream不能读取中文路径名的解决方法
- Linux中Sublime_Text3的安装方法以及不能中文输入的问题解决
- 解决fstream.open()不能正确读取中文路径的问题
- Python实现的json文件读取及中文乱码显示问题解决方法
- fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
- JavaScript读取中文cookie时的乱码问题的解决方法
- SQLServer2005不能输入中文的问题解决方法
- C#中关于从剪贴板中读取HTML格式含中文字符会出现的问题和解决方法
- 发布到SPS站点下的ASP.NET页面上的中文不能正常显示__问题解决方法
- JMagick 学习五:解决不能读取中文路径问题
- JavaScript读取中文cookie时的乱码问题的解决方法
- 利用jasperreports报表生成pdf文档中文不能显示问题解决方法
- (转)XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)(附带解决DHTMLX不能用在GB2312页面编码下的中文问题)
- mysql出现中文乱码或不能输入中文问题的Windows或Linux系统解决方法
- Flash读取XML文件的中文时出现乱码问题解决方法
- 关于vs2013中不能输入中文的问题解决方法