как узнать кодировку файла xml
Информационные технологии, интернет, веб программирование, IT, Hi-Tech, …
Кодировка XML
Здравствуйте, уважаемые посетители сайта okITgo.ru! Продолжаем рассматривать язык разметки XML.
XML документы могут содержать символы, не входящие в ASCII, например норвежские, или французские.
Чтобы избежать ошибок, указывайте кодировку XML, или сохраняйте XML файлы в формате Уникод.
Ошибки Кодировки XML
При загрузке XML документа, Вы можете получить две различные ошибки, указывающие на проблемы с кодировкой:
Неправильный символ был найден в текстовом содержимом.
Вы получаете эту ошибку, если ваш XML содержит символы, не входящие в ASCII, и файл был сохранен как однобайтовый ANSI (или ASCII) без указания кодировки.
Переключение из текущей кодировки в указанную кодировку не поддерживается.
Вы получаете эту ошибку, если ваш XML файл был сохранен как двухбайтовый Уникод (или UTF-16) с указанной однобайтовой кодировкой (например, Windows-1251,
ISO-8859-1, UTF-8).
Вы также получаете эту ошибку, если ваш XML файл был сохранен как однобайтовый ANSI (или ASCII) с указанной двухбайтовой кодировкой (например, UTF-16).
Блокнот Windows
Блокнот Windows сохраняет файлы как однобайтовые ANSI (ASCII) по умолчанию.
Если Вы выберите «Сохранить как…», Вы можете указать двухбайтовый Уникод (UTF-16).
Сохраните XML файл ниже как Уникод (заметьте, что документ не содержит атрибута кодировки):
Света |
Файл выше, note_encode_none_u.xml НЕ будет генерировать ошибку. Но если Вы укажете однобайтовую кодировку, то будет.
Кодировка (откройте файл), вызовет сообщение об ошибке:
Следующая кодировка (откройте файл), вызовет сообщение об ошибке:
Следующая кодировка (откройте файл), вызовет сообщение об ошибке:
Следующая кодировка (откройте файл), НЕ будет генерировать ошибку:
Выводы
Как узнать кодировку файла xml
Опытный
Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006
Репутация: нет
Всего: нет
P.S. Смотрел класс InputSource. Там есть метод getEncoding. Но когда делаю так:
Код |
InputSource iSource = new InputSource(new FileInputStream(«c:/1.xml»)); System.out.println(iSource.getEncoding()); |
Вывод на консоль: null.
Leprechaun Software Developer
Профиль
Группа: Модератор
Сообщений: 15680
Регистрация: 24.3.2004
Репутация: 206
Всего: 534
В InputSource можно передать Reader, и тогда за кодировку уже будет отвечать Reader, на параметр пролога парсер обращать внимание не будет.
Вопрос только в том, как определить в какой кодировке файл? На мой взгляд это перекладывание проблемы с больной головы на здоровую. Если в прологе написано, что кодировка Cp-1251, то там и должна быть кодировка Cp-1251, а не какая нибудь другая. А если нет, то это невалидный XML, и это уже проблемы того кто его создавал.
Опытный
Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006
Репутация: нет
Всего: нет
Цитата(LSD @ 29.3.2008, 19:58) |
Вопрос только в том, как определить в какой кодировке файл? На мой взгляд это перекладывание проблемы с больной головы на здоровую. Если в прологе написано, что кодировка 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;
public class Props <
private static final String JAXP_SCHEMA_LANGUAGE = «http://java.sun.com/xml/jaxp/properties/schemaLanguage»;
private static final String W3C_XML_SCHEMA = «http://www.w3.org/2001/XMLSchema»;
private static final String JAXP_SCHEMA_SOURCE = «http://java.sun.com/xml/jaxp/properties/schemaSource»;
private static CatalogResolver xmlCatalogResolver;
private static final class CharsetHandler implements ContentHandler <
private Locator2Impl loc2impl;
private Locator2 fLocator;
public void setDocumentLocator(Locator locator) <
if (locator instanceof Locator2) <
fLocator = (Locator2) locator;
> else <
Logger.getLogger(this.getClass().getName()).error(
«There’s no getEncoding() method in »
+ locator.getClass().getName());
throw new RuntimeException(
«Используется старая версия xml-парсера, не поддерживающая SAX2 Extensions 1.1 (beta1)»);
>
public String getCharset() <
return loc2impl.getEncoding();
>
public String getVersion() <
return loc2impl.getXMLVersion();
>
// все остальные методы не используем
public void endDocument() throws SAXException <
>
public void startDocument() throws SAXException <
>
public void characters(char[] ch, int start, int length)
throws SAXException <
>
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException <
>
public void endPrefixMapping(String prefix) throws SAXException <
>
public void skippedEntity(String name) throws SAXException <
>
public void processingInstruction(String target, String data)
throws SAXException <
>
public void startPrefixMapping(String prefix, String uri)
throws SAXException <
>
public void endElement(String namespaceURI, String localName,
String qName) throws SAXException <
>
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException <
private static CharsetHandler contentHandler = new CharsetHandler();
public static void main(String args[]) throws ParserConfigurationException, SAXException, FileNotFoundException, IOException <
ThreadLocal xmlReader = new ThreadLocal();
final ThreadLocal validationLogWarnings = new ThreadLocal();
final ThreadLocal validationLogErrors = new ThreadLocal();
final ThreadLocal validationLogFatalErrors = new ThreadLocal();
final int stopValidationOnError = 5;
System.out.println(«begin. «);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser;
factory.setValidating(true);
saxParser = factory.newSAXParser();
saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
XMLReader reader = saxParser.getXMLReader();
reader.setFeature(«http://apache.org/xml/features/allow-java-encodings»,true);
CatalogManager catalogManager = new CatalogManager();
catalogManager.setCatalogFiles(«c:/CatalogManager.properties»);
// System.out.println(«class name=»+catalogManager.getCatalogClassName());
// catalogManager.setCatalogFiles(«c:/CatalogManager.properties»);
Vector v = catalogManager.getCatalogFiles();
System.out.println(catalogManager.getPrivateCatalog().getCurrentBase());
Enumeration enumer = v.elements();
xmlCatalogResolver = new CatalogResolver();
reader.setErrorHandler(new DefaultHandler() <
private int errorNumber = 0;
public void warning (SAXParseException e) throws SAXException <
((List) validationLogWarnings.get()).add(e);
>
public void error(SAXParseException e) throws SAXException <
((List) validationLogErrors.get()).add(e);
if (stopValidationOnError!=-1 && ++errorNumber>=stopValidationOnError)
throw e;
>
public void fatalError (SAXParseException e) throws SAXException <
((List) validationLogFatalErrors.get()).add(e);
throw e;
>
>);
reader.setContentHandler(contentHandler);
xmlReader.set(reader);
validationLogWarnings.set(new ArrayList());
validationLogErrors.set(new ArrayList());
validationLogFatalErrors.set(new ArrayList());
((XMLReader) xmlReader.get()).parse(new InputSource(new FileInputStream(«c:/1.xml»)));
String docEncoding = contentHandler.getCharset();
System.out.println(«docEncoding = «+ docEncoding);
System.out.println(«Документ соответствует схеме»);
>
>
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.
[ Время генерации скрипта: 0.1112 ] [ Использовано запросов: 21 ] [ GZIP включён ] Как узнать кодировку xml-файлаПомощь в написании контрольных, курсовых и дипломных работ здесь. Как указать кодировку XML документа? Как узнать кодировку файла? Как изменить кодировку XML-файла? Как узнать кодировку файла средствами php? Добавлено через 54 минуты И кстати: здесь на форуме запрещено постить ссылки на другие форумы Помощь в написании контрольных, курсовых и дипломных работ здесь. Как узнать текущую кодировку файла в Sublime Text 3? Задать кодировку чтения у xml файла Как узнать имя элемента схемы XSD при построчном чтении файла xml Как узнать кодировку пульта ДУ Злой XML с двумя кодировкамиКакие кодировки работают в XMLСпецификация обязывает парсеры понимать две кодировки: UTF-8 и UTF-16. Парсеры поддерживают больше, но для атаки хватит и этих. UTF-8 и UTF-16 отображают одни и те же символы — из таблицы Юникода. Разница между кодировками в том, как они хранят номер символа. UTF-8 Код символа хранится по шаблону:
Кодировать символы избыточно нельзя. Самый короткий способ — верный. UTF-16 Код символа хранится по шаблону:
* Из кода предварительно вычитается 0x010000 Запись символа с помощью 4-х байт называется суррогатной парой. Пара состоит из двух обычных символов, но из зарезервированного диапазона: от U+D800 до U+DFFF. Половинки пары сами по себе недействительны. UTF-16 бывает двух видов: UTF-16BE и UTF-16LE (big-endian / little-endian). В них разный порядок байт. Big-endian — «естественный» порядок байт, как у арабских цифр. Примеры записи символов в UTF-16BE и UTF-16LE
* В четырех-байтовых символах группы из 2-х байт переворачиваются отдельно. Это сделано для обратной совместимости с Unicode 1.0, где все символы состояли только из двух байт. Как парсеры определяют кодировкуПарсеры определяют кодировку четырьмя способами: Внешняя информация о кодировке Чаще всего это протоколы, которые построены по стандарту MIME: например SMTP, HTTP и WebDAV. Byte Order Mark (BOM) BOM — символ с кодом U+FEFF. Если парсер найдет его в начале, то он определит кодировку по тому, как он записан. Кодировка в XML документеXML документы могут содержать символы в различных международных кодировках. Чтобы не возникало ошибок, необходимо указывать, какая кодировка используется в XML документе, либо сохранять файл в универсальной кодировке UTF-8. Символьная кодировкаСимвольная кодировка определяет уникальный бинарный код для различных символов, используемых в документе. В компьютерных терминах символьную кодировку также называют символьным набором, символьной раскладкой, кодовым набором и кодом страницы. ЮникодЮникод — это промышленный стандарт для символьной кодировки текстового документа. Он определяет (почти) все возможные международные символы по именам и числам. Юникод имеет две разновидности: UTF-8 и UTF-16. UTF = формат преобразования Юникода (анг. Unicode Transformation Format). UTF-8 использует один байт (8 бит) для представления общепринятых символов и два (или три) байта для всех остальных символов. UTF-16 использует два байта (16 бит) для большинства символов и три байта для всего остального. UTF-8 — стандартная кодировка символов в сети Интернет. UTF-8 считается кодировкой по умолчанию в HTML-5, CSS, JavaScript, PHP, SQL и XML. Кодировка XML документаПервая строка в XML документе называется прологом: Пролог является необязательным и, как правило, содержит номер версии XML. Кроме этого, он может содержать информацию о кодировке XML документа. Следующий пролог определяет кодировку UTF-8: Стандартизация XML устанавливает, что все приложения XML должны понимать кодировки UTF-8 и UTF-16. UTF-8 является кодировкой по умолчанию для XML документов без информации о кодировке. Кроме этого, большинство систем приложений XML работают с такими кодировками, как ISO-8859-1, Windows-1252 и ASCII. Ошибки XMLОчень часто XML документы создаются на одном компьютере, на сервер выгружается с другого, а в браузере отображаются на третьем компьютере. Если кодировка некорректно интерпретируется всеми тремя компьютерами, то браузер отобразит бессмысленный набор символов, либо вообще выдаст сообщение об ошибке. Наилучшим выбором в этом случае будет использование кодировки UTF-8. UTF-8 позволяет отображать практически все международные символы, и, кроме этого, она считается кодировкой по умолчанию, если не указана другая кодировка. ЗаключениеКогда вы пишите XML документ:
|