0

在我分配的项目中,原作者写了一个函数:

  public String asString() throws DataException
  {
    if (getData() == null) return null;

    CharBuffer charBuf = null;

    try
    {
        charBuf = s_charset.newDecoder().decode(ByteBuffer.wrap(f_data));
    }
    catch (CharacterCodingException e)
    {
        throw new DataException("You can't have a string from this ParasolBlob: " + this, e);
    }

    return charBuf.toString()+"你好";
 }   

请注意,常量 s_charset 定义为:

private static final Charset s_charset = Charset.forName("UTF-8");

另请注意,我在返回字符串中硬编码了一个中文字符串。

现在当程序流到达这个方法时,它会抛出以下异常:

 java.nio.charset.UnmappableCharacterException: Input length = 2

更有趣的是,硬编码的中文字符串会显示为“??” 如果我执行 System.out.println() 在控制台。

我认为这个问题在本地化方面非常有趣。我已经尝试将其更改为 Charset.forName("GBK");

但似乎不是解决方案。此外,我已将 Java 类的编码设置为“UTF-8”。

有没有专家有这方面的经验?你能分享一点吗?提前致谢!

4

3 回答 3

3

更有趣的是,硬编码的中文字符串会显示为“??” 如果我执行 System.out.println() 在控制台。

System.out 执行从 UTF-16 字符串到默认 JRE 字符编码的转码操作。如果这与接收字符数据的设备使用的编码不匹配,则会损坏。因此,应将控制台设置为使用正确的字符编码(UTF-8)来正确呈现中文字符。

如果您使用的是 Eclipse,那么您可以通过以下方式更改控制台编码

运行配置-> 通用-> 编码(从下拉列表中选择 UTF-8)

在此处输入图像描述

于 2013-07-15T09:55:03.913 回答
0

Java 字符串是 unicodes

System.out.println("你好");
于 2013-07-15T09:58:10.163 回答
0

正如 Kevin 所说,根据源文件的底层编码,该编码将用于将其转换为 UTF-16BE(Java 字符串的真实编码)。所以当你看到“??” 这肯定是简单的转换错误。

现在,如果您想使用给定的字符编码将简单的字节数组转换为字符串,我相信有比使用 raw 更简单的方法CharsetDecoder。那是:

byte[] bytes = {0x61};
String string = new String(bytes, Charset.forName("UTF-8"));
System.out.println(string);

如果字节数组确实包含 UTF-8 编码的字节流,这将起作用。并且它必须没有BOM,否则转换可能会失败。确保您尝试转换的内容不是以序列开头0xEF 0xBB 0xBF

于 2013-07-15T17:53:43.943 回答