Java中的日语字符编码

5

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

我将每个字符串都传递给encoding(str)函数,但当我打印返回值时,它仍然是"???"(如下所示),而不是日语字符(平假名、片假名或汉字)。

title-jp=???

有人能帮我解决这个问题吗?非常感谢。


1
你是如何“检查”结果的?Windows命令行在显示国际字符时存在问题。(也就是说,除非区域设置正确,否则通常不会安装字体) - Mysticial
2个回答

2
您的changeCharset方法看起来有些奇怪。在Java中,String对象最好被认为没有特定的字符集。它们使用Unicode,因此可以表示所有字符,而不仅仅是一个区域子集。您的方法说:使用我的系统字符集(无论它是什么)将字符串转换为字节,然后尝试使用其他字符集(在newCharset中指定)解释这些字节,因此可能不起作用。如果您使用编码将其转换为字节,则应使用相同的编码读取这些字节。 更新: 要将字符串转换为Shift-JIS(日本常用的区域编码),您可以使用以下代码:
byte[] jis = str.getBytes("Shift_JIS");

如果您将这些字节写入文件,并在区域设置为日本的Windows计算机上使用记事本打开该文件,则记事本将以日文显示(没有其他可依据,它会假定文本位于系统本地编码中)。
然而,同样可以将其保存为UTF-8格式(带有3字节的UTF-8引导序列),记事本也会以日本语言显示。Shift-JIS仅是一种将日本文本表示为字节的方法之一。

你能给我一个建议,如何将给定的字符串转换为日语编码吗?非常感谢。 - Allan Jiang

2
我怀疑你一开始就不应该这样做。如果真的是Apache POI的问题,那么你需要从数据中获取原始字节,而不仅仅使用系统默认编码。
另一方面,我认为Apache POI很可能已经做得很对了,只是输出有问题。我建议你以Unicode代码点的形式转储你所拥有的原始字符串(完全删除你的编码方法)。
 for (int i = 0; i < text.length; i++) {
     System.out.println("U+" + Integer.toHexString(text.charAt(i));
 }

然后将这些Unicode值与Unicode网站上的值进行比对。


如果他正在使用Windows命令行来输出字符,那么这可能会解释问题。但是,如果他正在使用Eclipse或其他IDE,则不应该发生这种情况。 - Voo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接