getBytes ("UCS-2") возвращает разные результаты на разных устройствах с разными уровнями API - PullRequest
0 голосов
/ 06 июня 2018

В настоящее время у меня проблема со следующим кодом:

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, 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, 48, 0, 57, 0, 48

кажется, что результат поменялся напара: [-1 -2] против [-2 -1] ... [48 0] против [0 48].

Так в чем здесь проблема?Что-нибудь изменилось с Java или Android?

1 Ответ

0 голосов
/ 17 июля 2018

Кодировка UCS-2 эффективно UTF-16 на Android 8.x и 9.0 .На Android 8.1, android engineering следующие изменения в кодировке UTF-16.

Обратите внимание, что маркер спецификации (-2, -1) включен в вывод.Если вам нужен стабильный результат на устройстве, вы можете использовать UTF-16BE по желанию.Ниже приведены подробности изменения поведения.

UTF-16 Байт-порядок упорядочения выходных данных Charset

Кодировка UTF-16 (получена через java.nio.charset.Charset.forName("UTF-16")или java.nio.charset.StandardCharsets.UTF_16) теперь кодирует строки в байты UTF-16 с прямым порядком байтов с помощью маркера порядка байтов, как утверждает Javadoc.Ранее он кодировался как little-endian с маркером порядка байтов, что противоречит документации.

Это также меняет результат вызова getBytes("UTF-16") для строки.Это не имеет значения для кода, который использует кодировку UTF-16 для кодирования и декодирования строк, поскольку декодирование подчиняется метке порядка байтов.Это влияет только на код, который использует кодировку UTF-16 для кодирования, а затем предполагает, что результирующие байты имеют младший порядок, например, декодируя их с помощью механизма, игнорирующего маркер порядка байтов.

Пользователи, желающиекодировать как little-endian с маркером порядка байтов можно с помощью x-UTF-16LE-BOM Charset.(Обратите внимание, что этот Charset не должен использоваться для декодирования байтов, если только они не известны как последовательности с прямым порядком байтов.)

...