Как узнать кодировку 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 включён ]
Читайте также: