byte[] utf8Bytes = Xml.getBytes("Cp1256");
String roundTrip = new String(utf8Bytes, "UTF-8");
Это попытка исправить неправильно декодированную строку. В какой-то момент перед этой операцией вы прочитали Xml
, используя кодировку по умолчанию, которая на вашей коробке Windows является кодовой страницей 1256 (арабский язык Windows). Здесь вы кодируете эту строку обратно на кодовую страницу 1256, чтобы получить ее исходные байты, а затем декодируете ее должным образом в соответствии с кодировкой, которую вы на самом деле хотели, UTF-8.
На вашем сервере Linux происходит сбой, потому что кодировка по умолчанию отличается от Cp1256
; он также не работает на любом сервере Windows, не установленном в арабском языке.
Закомментированная строка, которая использует кодировку по умолчанию вместо явно Cp1256
, более вероятно, будет работать на сервере Linux. Однако реальное исправление состоит в том, чтобы найти, где читается Xml
, и исправить эту операцию, чтобы использовать правильную кодировку (*) вместо значения по умолчанию. Разрешение использования кодировки по умолчанию почти всегда является ошибкой, поскольку оно делает приложения зависимыми от конфигурации, которая варьируется между серверами.
(*: для этого канала это UTF-8, которая является наиболее распространенной кодировкой, но может отличаться для других. Поиск правильной кодировки для канала зависит от заголовка Content-Type
, возвращаемого для ресурса, и от <?xml encoding
объявление. Безусловно, лучший способ справиться с этим - извлечь и проанализировать ресурс, используя соответствующую XML-библиотеку, которая знает об этом, например, с помощью DocumentBuilder.parse(uri)
.)