Как узнать кодировку xml файла

Обновлено: 06.07.2024

Репутация: нет
Всего: нет

Слышал, что SAX-парсер выбирает кодировку из заголовка xml-файла. Если такую не находит, то использует utf-8.
Вопрос мой задан с тем, чтобы подстраховаться.
Например такой вариант: мне присылают xml-файл. В заголовке написана кодировка Cp-1251, но на самом деле кодировка - utf-8. В данном случае парсер разберёт документ как Cp-1251. Это может быть чревато разбором русских символов.
Возможно у кого-то есть решение?

P.S. Смотрел класс InputSource. Там есть метод getEncoding. Но когда делаю так:

Вывод на консоль: null.

Вобщем кто может, помогите чем можете
Спасибо.

Leprechaun Software Developer

Репутация: 206
Всего: 534

В InputSource можно передать Reader, и тогда за кодировку уже будет отвечать Reader, на параметр пролога парсер обращать внимание не будет.

Вопрос только в том, как определить в какой кодировке файл? На мой взгляд это перекладывание проблемы с больной головы на здоровую. Если в прологе написано, что кодировка Cp-1251, то там и должна быть кодировка Cp-1251, а не какая нибудь другая. А если нет, то это невалидный XML, и это уже проблемы того кто его создавал.

Репутация: нет
Всего: нет

Код

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.log4j.Logger;
import org.apache.xml.resolver.CatalogManager;
import org.apache.xml.resolver.tools.CatalogResolver;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.Locator2;
import org.xml.sax.ext.Locator2Impl;
import org.xml.sax.helpers.DefaultHandler;

private static CatalogResolver xmlCatalogResolver;

private static final class CharsetHandler implements ContentHandler private Locator2Impl loc2impl;
private Locator2 fLocator;

Для того, чтобы это всё заработало необходим файл CatalogManager.properties. Запихнуть его надо в папку с этим классом. Пробовал переопределять местоположение файла - не вышло. Может кто знает как это сделать?
CatalogManager.properties:


папка xsd должна также быть в одной директории с классом.
в папке xsd должен быть файл catalog.xml и схема.
catalog.xml:

кроме файла catalog.xml должны быть 2 файла(как видно из файла catalog.xml).
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

[ Время генерации скрипта: 0.1110 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Читайте также: