Java中的日文字符编码

时间:2011-10-08 18:17:29

标签: java unicode cjk

这是我的问题。我现在正在使用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=???

任何人都可以帮我这个吗?非常感谢你。

2 个答案:

答案 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值。