今天在利用web Dynpo开发一个从Excel文件中读取信息,并在页面上展示的功能。通过网上找到一个jexcelapi的开发包,发现处理Excel文件非常强大,可以很方便的对Excel文件进行操作。但是当我进行读取Excel文件时,如果Excel文件中有中文时,出现了乱码。我尝试了各种字符集转化,折腾了一个下午还是没有搞定。根据网上朋友提供的设置了workbooksettings的编码,结束还是没有解决。最后我进行jxl源代码的单步调试,最后跟踪到jxl.biff.StringHelper这个类的getUnicodeString方法时
public static String getUnicodeString(byte[] d, int length, int pos)
{
try
{
byte[] b = new byte[length * 2];
System.arraycopy(d, pos, b, 0, length * 2);
return new String(b, UNICODE_ENCODING);
}
catch (UnsupportedEncodingException e)
{
// Fail silently
return "";
}
}
在return,经过new String转化以后就出现了乱码。
然后我就在StringHelper类中找到 UNICODE_ENCODING值为UnicodeLittle
然后在 注释中发现
// Due to a a Sun bug in some versions of JVM 1.4, the UnicodeLittle
// encoding doesn't always work. Making this a public static field
// enables client code access to this (but in an undocumented and
// unsupported fashion). Suggested alternative values for this
// are "UTF-16LE" or "UnicodeLittleUnmarked
说明在部分1.4的JVM中UnicodeLittle运行不正常,然后我就把
public static String UNICODE_ENCODING = "UnicodeLittle";
改成
public static String UNICODE_ENCODING = "UTF-16LE";
然后把这个类重新编译后,添加到原先的Jar包,覆盖原先的StringHelper类,再次运行我的程序,读到中文后显示一起OK。
.