Преобразование XML в JSON приводит к появлению неизвестных символов при работе на Centos вместо Windows - PullRequest
0 голосов
/ 05 февраля 2012

У меня есть сервлет Java, который получает RSS-каналы и преобразует их в JSON.Он отлично работает на Windows, но не работает на Centos.

Канал RSS содержит арабский язык и показывает неразборчивые символы на Centos.Я использую эти строки для кодирования RSS-канала:

byte[] utf8Bytes = Xml.getBytes("Cp1256");
//  byte[] defaultBytes = Xml.getBytes();

String roundTrip = new String(utf8Bytes, "UTF-8");

Я пробовал это на Glassfish и Tomcat.У обоих одна и та же проблема;он работает на Windows, но не работает на Centos.Как это вызвано и как я могу решить это?

Ответы [ 2 ]

5 голосов
/ 05 февраля 2012
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).)

1 голос
/ 05 февраля 2012

Есть много мест, где можно использовать неправильную кодировку.Вот полный список http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8

...