【发布时间】:2019-03-11 15:58:16
【问题描述】:
Android 9 中引入的行为更改之一是更严格的UTF-8 decoder。如果我们有一个字节数组不是正确的 UTF-8 字符串(例如随机字节或一些二进制数据)并尝试从中创建一个字符串:
return new String(bytes)
Android 将选择 UTF-8 作为首选编码(这很好),但在 Android 9 上返回的结果与在旧版本的 Android 上略有不同。
我知道首先将随机字节转换为 UTF-8 字符串听起来不是一个好主意,但我现在需要向后兼容。
是否可以选择在所有 Android 版本上获得完全相同的字符串结果?
编辑:
重现步骤:
byte[] bytes = new byte[]{25, 17, 113, 18, 62, 121, -6, -71, 45, -126, -113, 122, 58, 49, -30, -53, -66, -7, 0, -41};
char[] password = new String(bytes).toCharArray();
byte[] passKey = PBEParametersGenerator.PKCS12PasswordToBytes(password);
Log.d("TEST", "Bytes: ".concat(Arrays.toString(passKey)));
Android
[0, 25, 0, 17, 0, 113, 0, 18, 0, 62, 0, 121, -1, -3, 0, 45, -1, -3, -1, -3, 0, 122, 0, 58, 0, 49, -1, -3, 2, -2, -1, -3, 0, 0, -1, -3, 0, 0]
Android 9.0 的输出:
[0, 25, 0, 17, 0, 113, 0, 18, 0, 62, 0, 121, -1, -3, -1, -3, 0, 45, -1, -3, -1, -3, 0, 122, 0, 58, 0, 49, -1, -3, 2, -2, -1, -3, 0, 0, -1, -3, 0, 0]
【问题讨论】:
-
更好的办法是将二进制数据转换为base64字符串,保证在任何平台上都是一样的,不限于Android。
-
我知道。有很多比 UTF-8 更好的选择,但我正在寻找一种向后兼容的解决方案。
-
不要升级到 Android 9 目标。升级和拥有“向后兼容”的解决方案是一个巨大的混乱(和错误,和“功能”)的开始。这是纠正程序(并允许过渡期)的好时机。
-
这种情况发生在所有 Android 9 设备上,无论 targetSDK 或 compileSDK 版本如何。
标签: java android encoding utf-8 android-9.0-pie