Java中的中文字符串处理?

时间:2013-07-15 09:49:11

标签: java utf-8 localization internationalization chinese-locale

在我指定的项目中,原作者编写了一个函数:

  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”。

任何专家都有这方面的经验吗?请你分享一下吗?提前谢谢!

3 个答案:

答案 0 :(得分:3)

  

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

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

如果您正在使用eclipse,那么您可以通过转到

来更改控制台编码
  

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

enter image description here

答案 1 :(得分:0)

Java字符串是unicodes

System.out.println("你好");

答案 2 :(得分:0)

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

现在,如果你想使用给定的字符编码将简单字节数组转换为String,我相信有比使用原始CharsetDecoder更容易的方法。那就是:

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

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