Как проверить кодировку файла xml
Перейти к содержимому

Как проверить кодировку файла xml

  • автор:

Кодировка в XML документе

XML документы могут содержать символы в различных международных кодировках.

Чтобы не возникало ошибок, необходимо указывать, какая кодировка используется в XML документе, либо сохранять файл в универсальной кодировке UTF-8.

Символьная кодировка

Символьная кодировка определяет уникальный бинарный код для различных символов, используемых в документе.

В компьютерных терминах символьную кодировку также называют символьным набором, символьной раскладкой, кодовым набором и кодом страницы.

Юникод

Юникод — это промышленный стандарт для символьной кодировки текстового документа. Он определяет (почти) все возможные международные символы по именам и числам.

Юникод имеет две разновидности: UTF-8 и UTF-16.

UTF = формат преобразования Юникода (анг. Unicode Transformation Format).

UTF-8 использует один байт (8 бит) для представления общепринятых символов и два (или три) байта для всех остальных символов.

UTF-16 использует два байта (16 бит) для большинства символов и три байта для всего остального.

UTF-8 — Веб-стандарт

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 документ:

  • Используйте текстовый редактор, который позволяет изменять кодировку документа
  • Убедитесь, что редактор настроен на использование нужной кодировки
  • Опишите используемую кодировку в соответствующей декларации
  • UTF-8 является самой безопасной кодировкой
  • UTF-8 является стандартом в сети Интернет

Как проверить кодировку файла xml

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Помог: 3 раз(а)

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

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

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Цитата:

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Как прочитать xml файл в указанной в нём кодировке на javascript

Есть клиентское приложение (НЕ node.js!), которое обрабатывает xml файлы. Юзер подгружает их на страницу, и дальше их надо парсить в браузере. Очень упрощенно код такой:

function openFile(event) < let input = event.target; let reader = new FileReader(); reader.onload = function () < parse(reader.result); >; reader.onerror = function () < console.log(reader.error); >; reader.readAsText(input.files[0]); > function parse(text) < let parser = new DOMParser(); let xml = parser.parseFromString(text, "text/xml"); console.log(xml.xmlEncoding); //ок, но что дальше? for (let row of xml.getElementsByTagName("row")) < console.log(row.getAttribute("name"), row.firstChild.nodeValue); >>

Содержимое XML файла значения не имеет, для примера:

  значение  

Если файл в кодировке UTF-8 , то все хорошо. Но он может быть, например, в кодировке windows-1251 , тогда структура сохраняется, но внутри имя и значение будут знаками вопроса. Если я вызову чтение с явным указанием кодировки, то все будет работать:

reader.readAsText(input.files[0], 'windows-1251'); 

Но проблема в том, что я не знаю, какая она изначально. Как быть?

Как проверить кодировку файла xml

Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006

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

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

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

Код
InputSource iSource = new InputSource(new FileInputStream(«c:/1.xml»));
System.out.println(iSource.getEncoding());

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

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

Дата 29.3.2008, 19:58 (ссылка) | (нет голосов) Загрузка .

Leprechaun Software Developer

Профиль
Группа: Модератор
Сообщений: 15707
Регистрация: 24.3.2004

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

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

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

Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don’t take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don’t read it.

Дата 31.3.2008, 09:56 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006

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

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

Согласен полностью насчёт того, что проблемы создающего. Но если это будет реально дурная голова. Например человек создал в блокноте xml-файл и написал в заголовке кодировку UTF-8. Как доказать, что кодировка Cp1251?
P.S. насчёт определения — скачал вот здесь http://www.apache.org/dist/xml/commons/ библиотеку resolver.jar.
Вот набросал небольшой примерчик (точнее спёр его полностью ). Если кому интересно, то вот:

Код
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

if (fLocator != null) loc2impl = new Locator2Impl(fLocator);
fLocator = null;
>
>
>

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(«Документ соответствует схеме»);
>
>

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

Код
#relative-catalogs=false
xml.catalog.verbosity=99
catalogs=xsd/catalog.xml

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *