这是我的问题。我现在正在使用Java Apache POI来读取Excel(.xls或.xlsx)文件,并显示内容。电子表格中有一些日语字符,我得到的所有日语字符都是“???”在我的输出中。我尝试使用Shift-JIS,UTF-8和许多其他编码方式,但它不起作用...... 这是我的编码代码:
public String encoding(String str) throws UnsupportedEncodingException{
String Encoding = "Shift_JIS";
return this.changeCharset(str, Encoding);
}
public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException {
if (str != null) {
byte[] bs = str.getBytes();
return new String(bs, newCharset);
}
return null;
}
我传入了编码的所有字符串(str)。但是当我打印返回值时,它仍然像“???” (如下所示)但不是日文字符(平假名,片假名或汉字)。
title-jp=???
任何人都可以帮我这个吗?非常感谢你。
答案 0 :(得分:2)
您的changeCharset
方法看起来很奇怪。 Java中的String
个对象最好被认为没有特定的字符集。它们使用Unicode,因此可以表示所有字符,而不仅仅是一个区域子集。您的方法说:使用我的系统的字符集(无论可能是什么)将字符串转换为字节,然后尝试使用其他字符集(在newCharset
中指定)解释这些字节,因此可能不起作用。如果在编码中转换为字节,则应使用相同的编码读取这些字节。
<强>更新强>:
要将String转换为Shift-JIS(日本常用的区域编码),您可以说:
byte[] jis = str.getBytes("Shift_JIS");
如果您将这些字节写入文件,然后在区域设置全部以日本为中心的Windows计算机上的记事本中打开该文件,记事本将以日语显示(没有其他任何内容,它将假设文本在系统的本地编码中。)
但是,您可以将其保存为UTF-8(以3字节UTF-8介绍器序列为前缀),而记事本也会将其显示为日语。 Shift-JIS只是一种将日文文本表示为字节的方式。
答案 1 :(得分:2)
我怀疑你不应该首先这样做。如果它确实是Apache POI的错误,那么你需要从数据中获取原始的原始字节,而不是只使用系统默认的包围。
另一方面,我认为Apache POI完全可能设法做正确的事情,而这只是一个输出问题。我建议您根据Unicode代码点转储您已获得的原始字符串(完全删除encoding
方法),例如
for (int i = 0; i < text.length; i++) {
System.out.println("U+" + Integer.toHexString(text.charAt(i));
}
然后根据ones at the Unicode web site检查这些Unicode值。