Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle JRE和Dalvik JVM上的不同结果_Java_Android_Utf 8_Character Encoding_Dalvik - Fatal编程技术网

Java Oracle JRE和Dalvik JVM上的不同结果

Java Oracle JRE和Dalvik JVM上的不同结果,java,android,utf-8,character-encoding,dalvik,Java,Android,Utf 8,Character Encoding,Dalvik,我在为Android应用程序创建许可证管理器时遇到了麻烦,该应用程序的许可证密钥在桌面服务器上生成,验证代码在Android设备上运行。验证代码在桌面上执行时会产生所需的结果,但相同的代码在Android上会产生不同的结果 我调试了这个问题,结果被截取了 下面是一段代码片段来演示这一区别: byte[] bytes = {-88, 50, -29, 114, 51, 88, 38, -52, 114, 91, -23, -55, 124, 37, -90, -49, 36, -110, -67,

我在为Android应用程序创建许可证管理器时遇到了麻烦,该应用程序的许可证密钥在桌面服务器上生成,验证代码在Android设备上运行。验证代码在桌面上执行时会产生所需的结果,但相同的代码在Android上会产生不同的结果

我调试了这个问题,结果被截取了

下面是一段代码片段来演示这一区别:

byte[] bytes = {-88, 50, -29, 114, 51, 88, 38, -52, 114, 91, -23, -55, 124, 37, -90, -49, 36, -110, -67, -59, -33, -75, 85, -72, -109, 25, -54, 89, 6, 35, -50, -11, -87, -22, 33, -2, 55, -30, 75, -36, -40, -29, -103, 110, 46, -100, -68, 101, -105, 62, 53, -20, -20, -21, -118, -72, -27, 32, 59, 127, 15, -117, 6, 102};
System.out.println(new String(bytes, "UTF-8").hashCode());
在OracleJDK上,结果是

-24892055
但在安卓手机上,结果是:

-186036018

任何帮助都将不胜感激。

当您调用getBytes()时,您还需要在那里指定一个ECODE,否则您将从操作系统获得默认编码,可以是任何内容,例如
showBytes(新字符串(字节,“UTF-8”).getBytes(“UTF-8”)

调用getBytes()时,您还需要在那里指定一个ECODE,否则您将从操作系统获得默认编码,可以是任何内容,例如
showBytes(新字符串(字节,“UTF-8”).getBytes(“UTF-8”)

Android和Java处理格式错误的UTF-8的方式不同。给定四字节序列
0xf5 0xa9 0xea 0x21
,Android返回两个Unicode替换字符(
0xfffd
)。Oracle的类库返回三个Unicode替换字符

这里有一个简单的例子来说明这个问题

byte[] bytes = { (byte) 0xf5, (byte) 0xa9, (byte) 0xea, (byte) 0x21 };
String decoded = new String(bytes, "UTF-8");
for (int i = 0; i < decoded.length(); i++) {
  System.out.print(Integer.toHexString(decoded.charAt(i)) + " ");
}
Android的dalvikvm打印

fffd fffd
最好避免使用UTF-8解码字节序列,除非您知道它们实际上是UTF-8。我已经向Dalvik团队报告了这种不一致性,以进行调查:


如果您使用CharsetDecoder,Android将使用icu4c进行转换。返回U+fffd U+fffd U+0021,这在我阅读UTF-8规范时似乎也是正确的。在未来的版本中,Android的字符串将与Android的CharsetDecoder匹配。

Android和Java处理格式错误的UTF-8的方式不同。给定四字节序列
0xf5 0xa9 0xea 0x21
,Android返回两个Unicode替换字符(
0xfffd
)。Oracle的类库返回三个Unicode替换字符

这里有一个简单的例子来说明这个问题

byte[] bytes = { (byte) 0xf5, (byte) 0xa9, (byte) 0xea, (byte) 0x21 };
String decoded = new String(bytes, "UTF-8");
for (int i = 0; i < decoded.length(); i++) {
  System.out.print(Integer.toHexString(decoded.charAt(i)) + " ");
}
Android的dalvikvm打印

fffd fffd
最好避免使用UTF-8解码字节序列,除非您知道它们实际上是UTF-8。我已经向Dalvik团队报告了这种不一致性,以进行调查:


如果您使用CharsetDecoder,Android将使用icu4c进行转换。它返回U+fffd U+fffd U+0021,这在我阅读UTF-8规范时似乎也是正确的。在未来的版本中,Android的字符串将与Android的CharsetDecoder匹配。

我遇到了另一个问题:
byte[]bytes={-88,50,-29,114,51,88,38,-52,114,91,-23,-55,124,37,-90,-49,36,-110,-67,-59,-33,-75,85,-72,-109,25,-54,89,6,35,-50,-11,-87,-22,33,-2,55,-30,75,-36,-40,-29,-103,110,46,-100,-68,101,-105,62,53,-20,-21,-118,-72,-27,32,59,127,15,-117,6,102};System.out.println(新字符串,“UTF-8”).hashCode();
桌面上的输出:
-24892055
安卓上:
-186036018
这有什么错?你应该开始一个新问题,而不是完全改变原来的问题。我遇到了另一个问题:
字节[]字节={-88,50,-29,114,51,88,38,-52,114,91,-23,-55,124,37,-90,-49,36,-110,-67,-59,-33,-75,85,-72,-109,25,-54,89,6,35,-50,-11,-87,-22,33,-2,55,-30,75,-36,-40,-29,-103,110,46,-100,-68,101,-105,62,53,-20,-21,-118,-72,-27,32,59,127,15,-117,6,102};System.out.println(新字符串,“UTF-8”).hashCode();
桌面输出:
-24892055
安卓:
-186036018
这有什么错?你应该开始一个新问题,而不是完全改变原来的问题。为什么不使用谷歌的许可证验证库?()为什么不使用谷歌的许可证验证库?()