не правильно разбирается - PullRequest
3 голосов
/ 16 ноября 2008

Мое приложение будет читать xml из urlconnection. Кодировка xml - ISO-8859-1, она содержит символ é. Я использую xerces saxparser для анализа полученного XML-контента. Тем не менее, é не может быть правильно проанализирован при запуске приложения под ОС Lunix. Все отлично работает в Windows. Не могли бы вы, ребята, дать мне несколько советов? Большое спасибо

Ответы [ 5 ]

2 голосов
/ 16 ноября 2008

Это, вероятно, случай файла, помеченного как "ISO-8859-1", когда он в действительности находится в другой кодировке.

Часто это происходит с «ISO-8859-1» и «Windows-2152»: они используются так, как если бы они были взаимозаменяемыми, но это не так. (В комментариях к этому ответу было разъяснено, что обе кодировки согласовывают код символа для «é», поэтому Windows-1252, вероятно, не так.) Вы можете использовать Hex-редактор, чтобы узнать точный код символа "é" в вашем файле. Вы можете принять это значение как подсказку о том, в какой кодировке находится файл. Если у вас есть контроль над тем, как создается файл, то рекомендуется рассмотреть ответственный код / ​​метод.

1 голос
/ 16 ноября 2008

Первое, что вы должны сделать, это определить реальную кодировку XML-файла, как предполагает Томалак, а не кодировку, указанную в заголовке.

Вы можете начать, открыв его с помощью Internet Explorer. Если кодировка неверна, вы можете увидеть такую ​​ошибку:

Недопустимый символ был найден в тексте содержание. Ошибка обработки ресурса ...

Или следующий:

Переключиться с текущей кодировки на указанная кодировка не поддерживается. Ошибка обработки ресурса ...

Следующим шагом будет использование текстового редактора с поддержкой нескольких кодировок. Вы можете использовать Notepad ++ , который бесплатен, прост в использовании и поддерживает несколько кодировок. Независимо от того, что xml-заголовок говорит о кодировке, редактор пытается определить кодировку файла и отображает ее в строке состояния.

Если вы определили, что кодировка файла правильная, возможно, вы неправильно обрабатываете кодировку внутри Java. Примите во внимание, что строки Java имеют формат UTF-16 и по умолчанию при преобразовании из / в байтовые массивы, если кодировка не указана, Java по умолчанию использует системную кодировку (Windows-1521 под Windows или UTF-8 в современных Linux). Некоторые преобразования кодирования вызывают появление «странных» символов, например преобразований между фиксированными 8-битными кодировками (т. Е. Windows-1252 <-> ISO-8859-1). Другие преобразования приводят к возникновению конечных исключений из-за недопустимых символов (попробуйте импортировать текст Windows-1252 как UTF-8, например).

Пример неверного кода:

// Parse the input
SAXParser saxParser = factory.newSAXParser();
InputStream is = new ByteArrayInputStream(stringToParse.getBytes());
saxParser.parse( is, handler );

Преобразование stringToParse.getBytes() возвращает по умолчанию строку, закодированную как Windows-1252 на платформах Windows. Если текст XML был закодирован в ISO-8859-1 на этом этапе, у вас неправильные символы. Правильный шаг должен читать XML как байты, а не String, и позволить SAX управлять кодировкой xml.

1 голос
/ 16 ноября 2008

Бьюсь об заклад, это связано с file.encoding. Попробуйте запустить с -Dfile.encoding = iso-8859-1 в качестве параметра виртуальной машины в Linux.

Если это работает, вам, вероятно, нужно указать правильный формат при открытии потока (где-то в вашем коде).

0 голосов
/ 03 декабря 2008

Извините за поздний ответ. Мы решили проблему. Мы сделали какую-то неправильную операцию с входным потоком (так же, как сказал Фернандо Мигелес, преобразование вызвало проблемы).

Спасибо всем за помощь, ребята.

0 голосов
/ 19 ноября 2008

Если в декларации XML не указана кодировка, синтаксический анализатор попытается использовать кодировку по умолчанию, UTF-8.

Если вам известна кодировка символов, но она не указана в объявлении XML, вы можете указать синтаксическому анализатору использовать эту кодировку с InputSource:

InputSource inputSource = new InputSource(xmlInputStream);
inputSource.setEncoding("ISO-8859-1");
...