在我指定的项目中,原作者编写了一个函数:
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”。
任何专家都有这方面的经验吗?请你分享一下吗?提前谢谢!
答案 0 :(得分:3)
更有趣的是,硬编码的中文字符串将显示为 “??”在控制台,如果我做一个System.out.println()。
System.out执行从UTF-16字符串到默认JRE字符编码的转码操作。如果这与接收字符数据的设备使用的编码不匹配,则会损坏。因此,控制台应设置为使用正确的字符编码(UTF-8)来正确呈现中文字符。
如果您正在使用eclipse,那么您可以通过转到
来更改控制台编码运行配置 - >常见 - >编码(从下拉列表中选择UTF-8)
答案 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
开头。