0

我有一个编码问题。相同的代码在 Android 和 Windows 上产生不同的输出。我无法修改Android应用程序,因此我需要在windows上找到解决方案。这是代码:

 public void test() throws UnsupportedEncodingException
{
    byte[] a = {-95, -10, -63, -74, 99, -10, 74, -56, -85, 105};
    String ab = new String(a,"UTF-8");
    System.out.println("out:"+Arrays.toString((new  StringBuilder(String.valueOf(ab))).toString().getBytes("UTF-8")));
}

输出:

out:[-17, -65, -67, -17, -65, -67, 118, 99, -17, -65, -67, 74, -56, -85, 105] (on Android)
out:[-17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, 99, -17, -65, -67, 74, -56, -85, 105] (on Windows)

Android 似乎使用“java.nio.charset.CharsetICU[UTF-8]”。有什么建议么?

谢谢,亚历克斯

4

3 回答 3

2

这是因为 {-95, -10, -63, -74, 99, -10, 74, -56, -85, 105} 不是有效的 UTF-8 字节序列。new String(bytes, "UTF-8") 在这种情况下不会抛出任何异常,但结果很难预测。阅读http://en.wikipedia.org/wiki/UTF-8无效字节序列部分。

尝试使用 ISO-8859-1,它将字节转换为字符 1 : 1

于 2013-04-26T15:56:44.887 回答
1

如果您使用 aCharsetDecoder那么您可以控制错误输入的行为。您可以设置CharsetDecoder.replaceWith为已知字符串。

默认情况下,Charset.decode将替换格式错误的输入,但您也可以指定CodingErrorAction.REPORT改为抛出异常并直接拒绝格式错误的输入。

否则,解码器的名称暗示它正在委托给 ICU。您可能会发现icu4j的 UTF-8 实现与 Android 行为相匹配。

于 2013-04-27T11:04:14.730 回答
0

最后,它使用来自 Android 的 java.lang.String 类 [1] 中的 String(byte[] data, int offset, int byteCount, Charset charset) 中的代码。

[1] http://android.yongbok.net/repository/libcore/luni/src/main/java/java/lang/String.java

于 2013-04-27T21:54:10.290 回答