- Кодировка в XML документе
- Символьная кодировка
- Юникод
- UTF-8 — Веб-стандарт
- Кодировка XML документа
- Ошибки XML
- Заключение
- Информационные технологии, интернет, веб программирование, IT, Hi-Tech, …
- Кодировка XML
- Ошибки Кодировки XML
- Блокнот Windows
- Выводы
- Кодировка XML
- forum.clarionlife.net
- XML-файлы в кодовой таблице Windows-1251
- 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 является стандартом в сети Интернет
Информационные технологии, интернет, веб программирование, 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
- Используйте редактор, который поддерживает кодировки
- Удостоверьтесь, что знаете, какую кодировку использует ваш редактор
- Используйте ту же самую кодировку в атрибуте кодировки
Кодировка XML
Как выгрузить данные в XML в кодировке отличной от UTF-8 например Windows-1251.
Парметр КодировкаXML — только для чтения! Особенно убивает абсурд
ЗаписьХМЛ=Новый ЗаписьXML()
ЗаписьХМЛ.Параметры.Кодировка — тоже только для чтения.
Хочу подружить выгрузку из 8.1 и 7.7 подскажите обходные пути если они есть. Забавно что из 7.7 выгрузить можно в любой кодировке, а вот прочитать нет. В 8.1 наоборот.
И кто писал эти функции.
Описание:
Открывает файл для записи XML. Позволяет указать тип кодировки, который будет использован для записи файла XML.
И 1251 в том числе.
вот в спецификации сказано.
4.3.3 Character Encoding in Entities
Each external parsed entity in an XML document MAY use a different encoding for its characters. All XML processors MUST be able to read entities in both the UTF-8 and UTF-16 encodings. The terms «UTF-8» and «UTF-16» in this specification do not apply to character encodings with any other labels, even if the encodings or labels are very similar to UTF-8 or UTF-16.
Я не знаю — бился долго. Может у кого получилось? — у меня только так — (2)
. если указываешь 1251 ругается.
(12) А если указать кодировку «windows1251» (т.е без дефиса), то тоже проглатывает.
(15) не пробовал открывать.
Вот попробовал под win2003 английским с указанием кодировки именно «windows-1251».
Результат — .
Щас попробую сформировать чтонить простенькое и открыть.
(17) а вот 7.7 под рукой нет. Проверить не могу, мож Air777 попробует.
Кстати, файл формировался под win2003 английским. Открывался в нем же и в Vista русской. Под вистой обработка по формированию файла вылетает с ошибкой — «Неверная кодировка»
+(19) В общем итого, мож кому пригодиться. Следующий код формирует файл xml в кодировке «windows-1251». IE его корректно открывает. Что в Висте что в 2003 сервере.
forum.clarionlife.net
Место общения программистов, форум разработчиков БД на Clarion
XML-файлы в кодовой таблице Windows-1251
Сообщение Гость » 27 Август 2004, 13:27
Честно говоря, не знаю, кому может пригодиться .
Мне надо было генерировать (для заказчика) и читать (от заказчика) XML в кодовой таблице Window-1251.
1. Опишем русскую кодировку в CPXML.Inc
2. И заставим выводить данные в windows-1251 (CpXML.clw)
DOMToXMLFile procedure(*Document doc, string path, , UNSIGNED Format = Format:AS_IS)
3. После чего получим XML-файл (например, в Example\XMLParse) в кодировке Windows-1251, вполне отображаемый браузером. Но встаёт другая проблема — эти файлы не читаются кларионовским парсером (Шаблон ‘View XML File’ просто падает при загрузке). Ну что ж, тем хуже для парсера. Возьмём шестнадцатеричный редактор, найдём в модуле C60cpxml.dll текст ‘ISO-8859-1’, заменим на ‘WINDOWS-1251’ и добавим в конец ‘ ‘ .
4. Вопрос с документами в UTF-8 не рассматривается
Когда-то мне пришлось более плотнее исследовать C6 XML Support. Сделал точно такие же изменения как Вы.
Я не понял, тогда в этом случае все O’K, что ли?
С уважением, Семен Попов
А за это отвечает процедура CheckXMLName из CpXML.clw . Можно поставить в первую строку Return(0) — и будут приниматься любые теги
С уважением, Семен Попов
По крайней мере, файлы, созданные обычным текстовым редактором или сформированные программой (в том числе без использования интерфейса) читаются, только и всего. Просто похоже, что используемая библиотека в принципе не поддерживает кодировок, отличных от буржуинских, а это самый простой путь заставить это делать.
Сообщение Гость » 27 Август 2004, 13:34
Кстати, вместо «WINDOWS-1251» можно использовать «MS1251» — такой синтаксис тоже понимают все системы.
Этим самым экономится длина строки (ISO-8859-1 — 10 знаков, WINDOWS-1251 — 12 знаков) при бинарном рпедактировании.
Увы, это строка проверяется при вводе, а не выводе Поэтому приходится пожертвовать следующим полем — US-ASCII .
Ну, у Клариона я не проверял, к сожалению.
У меня был аналогичный случай по основной работе (программные продукты Documentum).
Мы тоже очень долго мучились с проблемой замены в бинарном файле «ISO_8859-1» на название русской кодировки. Мучились как раз из-за ттго, что нужно было уложиться «байт в байт». Проверяли все возможные варианты синтаксиса (кстати, кроме «Windows-1251» еще есть варианты «1251», «CP-1251», «ANSI-1251» и другие).
В итоге долгих экспериментов выяснилось, что «MS1251» читается даже, например, Интернет-Эксплорером.
Собственно говоря, можете проверить — замените в метатеге какой-нибудь HTML-страницы «Windows-1251» на «MS1251» — бедет работать.
Да речь не о Кларионе. Просто для создания DLL использовалась некая сишная библиотека. А в ней есть список допустимый кодовых таблиц, и Windows-1251 в ней НЕТ. Происходит чтение XML и поиск наименования кодовой страницы в списке. Ещё раз — это важно при ЧТЕНИИ XML-файла через кларионовский Support.
И если файл начинается на
,
то именно ‘WINDOWS-1251’ и должен быть в программе. Собственно, путём двухдневных хакерских «экспериментов» и был найден такой вариант.
Возможно, что можно подменить и другие текстовые строки. Кто займётся?
Кстати, попробовал CP-1251 и MS1251, браузер показал ошибку . Файл прилагается.
А вот список кодовых таблиц кириллицы из MSDN
Имя обозначение (алиасы)
Cyrillic (DOS) cp866 ( ibm866 )
Cyrillic (ISO) iso-8859-5 (csISOLatin5, csISOLatinCyrillic, cyrillic, ISO_8859-5, ISO_8859-5:1988, iso-ir-144, l5)
Cyrillic (KOI8-R) koi8-r (koi8-ru)
Cyrillic (KOI8-U) koi8-u
Cyrillic (Windows) windows-1251 (x-cp1251)
Действительно, выдает ошибку.
Получается, что для обычного HTML это работает, а для XML — нет.
Ну, Билл Гейтс — все запутал!
XML — проблемы с кодировкой
через XDTO создаю текст XML
потом пишу его в файл и проверяю на соответствие схеме
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КорневойРаздел);
это возвращает получившийся текст ХМЛ в реквизит документа типа Строка(0)
ИмяФайла = ПолучитьИмяВременногоФайла(«xml»);
ИмяФайлаСхемы = ПолучитьИмяВременногоФайла(«xsd»);
ФайлРеестра = Новый ТекстовыйДокумент;
ФайлРеестра.УстановитьТекст(Объект.ТекстВыгрузки);
ФайлРеестра.Записать(ИмяФайла,»windows-1251″);
ФайлСхемы = Новый ТекстовыйДокумент;
ФайлСхемы.УстановитьТекст(Объект.ТекстСхемыДокумента);
ФайлСхемы.Записать(ИмяФайлаСхемы,»windows-1251″);
Попытка
Схема=Новый COMОбъект(«MSXML2.XMLSchemaCache.6.0»);
Исключение
Сообщить(«Не удалось создать объект XMLSchemaCache (возможно, не установлен MSXML 6)»);
Возврат;
КонецПопытки;
Попытка
Схема.add(«»,ИмяФайлаСхемы);
Исключение
Сообщить(«Не удалось подключить схему: «+ИмяФайлаСхемы);
Схема=Неопределено;
Возврат;
КонецПопытки;
Попытка
ДОМ=Новый COMОбъект(«MSXML2.DOMDocument.6.0»);
Исключение
Сообщить(«Не удалось создать объект DOMDocument (возможно, не установлен MSXML 6)»);
Схема=Неопределено;
Возврат;
КонецПопытки;
ДОМ.schemas=Схема;
ДОМ.async=Ложь;
ДОМ.validateOnParse=Истина;
ДОМ.resolveExternals=Истина;
Если ВыводитьВсеОшибки Тогда
ДОМ.SetProperty(«MultipleErrorMessages»,Истина);
КонецЕсли;
ДОМ.load(ИмяФайла);
Если (ДОМ.parseError.errorCode<>0) Тогда
// ошибки при проверке правильности
Сообщить(«При проверке по схеме выявлены ошибки!»);
Если ВыводитьВсеОшибки Тогда
Для каждого parseError из ДОМ.parseError.AllErrors Цикл
Сообщить(parseError.reason);
Сообщить(parseError.srcText);
КонецЦикла;
Иначе
Сообщить(ДОМ.parseError);
КонецЕсли;
Иначе
Сообщить(«Файл успешно прошёл проверку по схеме!»);
РезПроверки=Истина;
КонецЕсли;
получаю ошибку на первом же атрибуте где встречается кириллица:
В текстовом комментарии обнаружен недопустимый знак.