Android getBytes(“UCS-2”)在具有不同API级别的不同设备中返回不同的结果

Android getBytes(“UCS-2”)在具有不同API级别的不同设备中返回不同的结果,android,string,byte,android-8.1-oreo,Android,String,Byte,Android 8.1 Oreo,目前,我对以下代码有问题: String a = "0932300090"; byte[] b = a.getBytes(Charset.forName("UCS-2")); Log.d("MTINH",Arrays.toString(b)); 这段代码已经在两个不同的设备上使用过,一个运行Android 8.0,另一个运行Android 8.1,我得到了两个不同的结果: 在Android 8.0中: -1,-2,48,0,57,0,51,0,50,0,51,0,48,0,48,0,57,0,

目前,我对以下代码有问题:

String a = "0932300090";
byte[] b = a.getBytes(Charset.forName("UCS-2"));
Log.d("MTINH",Arrays.toString(b));
这段代码已经在两个不同的设备上使用过,一个运行Android 8.0,另一个运行Android 8.1,我得到了两个不同的结果:

在Android 8.0中:

-1,-2,48,0,57,0,51,0,50,0,51,0,48,0,48,0,57,0,48,0

在Android 8.1中:

-2,-1,0,48,0,57,0,51,0,50,0,51,0,48,0,48,0,57,0,48

结果似乎是成对交换的:[-1-2]vs[-2-1]。。。[480]对[048]

那么这里的问题是什么?与Java或Android相比有任何变化吗?

UCS-2编码Android 8.x和9.0上有效地
UTF-16
。在安卓8.1上,安卓工程对UTF-16编码进行了以下更改

请注意,BOM标记(-2,-1)包含在输出中。如果您需要跨设备获得一致的结果,可以选择使用UTF-16BE。下面是行为更改的详细信息

UTF-16字符集输出字节顺序

UTF-16
Charset(通过
java.nio.Charset.Charset.forName(“UTF-16”)
java.nio.Charset.StandardCharsets.UTF_16
)将字符串编码为带有字节顺序标记的大端UTF-16字节,正如javadoc所说的那样。 以前,它编码为带字节顺序标记的小尾端,与文档相反

这也会更改对字符串调用
getBytes(“UTF-16”)
的结果。 这与使用
UTF-16
字符集对字符串进行编码和解码的代码没有区别,因为解码遵循字节顺序标记。它只影响使用
UTF-16
字符集编码的代码,然后假设生成的字节是小端字节,例如通过使用忽略字节顺序标记的机制对其进行解码


希望使用字节顺序标记编码为小尾端的用户可以使用
x-UTF-16LE-BOM
字符集。(请注意,此字符集不应用于解码字节,除非已知它们是小尾数。)

似乎是一个尾数问题。@MinasMina是的,此问题与字节顺序小尾数和大尾数有关。前两个字节是一个字节顺序标记(BOM),用于指定尾数。因此,即使字节流不同,对接收器来说也不应该是问题。