Немного про (кривые) кодировки XML

24.11.21

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Парочка функций для правильного чтения строк из XML.

В рамках текущей работы разбираю много файлов XML от внешних информационных систем, читаю обычным парсером ЧтениеXML.

Достаточно часто встречаются кривые файлы, когда кодировка файла - UTF (UTF-8, обычно), а в объявлении файла прописано, что данные в Windows-1251 (имеется тег encoding="windows-1251").

Тогда вместо строки ОАО "ТГК-9" читаем РћРђРћ "ТГК-9" - вот такая бяка...

Как определить, что читаем UTF? В википедии описаны маркеры, с которых начинается файл UTF. На основании этих маркеров написал функцию определения кодировки для случаев, когда данные файла существуют в виде ДвоичныеДанные.

 
 Функция КодировкаФайла(ДанныеФайла) Экспорт

Как бы, предварительно зная правильную кодировку, можно ее подсунуть в ЧтениеXML.ОткрытьФайл(...) параметром Кодировка:

ЧтениеXML.ОткрытьФайл(<ИмяФайлаXML>, <Параметры>, <НаборСхемXML>, <Кодировка>)

Но не тут-то было. Парсер начинает возмущаться, что его заставляют открывать файл не в той кодировке, которая прописана в объявлении. В общем, это не рабочий вариант.

Тогда приходится перекодировать прочитываемые строки. 

Для разбора файлов у меня написан небольшой фреймворк с общим модулем и обработками-десериализаторами, написанными по определенным правилам. Поэтому всякую химию по определению кодировки показать не могу - придется выдергивать и склеивать демо-код из разных мест.

Но вот функция нижнего уровня, которая используется для выправления кодировки:

 
 Функция ЗначениеУзлаВКодировкеИсточника(ЧтениеXML, ПоменятьКодировку = Ложь) Экспорт

 

Функция ЗначениеУзлаВКодировкеИсточника(ЧтениеXML, ПоменятьКодировку = Ложь) Экспорт
	Возврат ?(ПоменятьКодировку=Истина,
		ПолучитьСтрокуИзДвоичныхДанных(
			ПолучитьДвоичныеДанныеИзСтроки(ЧтениеXML.Значение, ЧтениеXML.КодировкаXML), 
			ЧтениеXML.КодировкаИсточника),
		ЧтениеXML.Значение);
КонецФункции

 

Кстати, у ЧтениеXML есть свойства КодировкаXMLКодировкаИсточника. Казалось бы, этими свойствами вполне себе можно воспользоваться для определения необходимости перекодировки.

Но тут тоже засада. Похоже, что парсер всегда обозначает, что читает UTF. Т.е., при чтении файла в Windows-кодировке, свойство ЧтениеXML.КодировкаИсточника имеет некорректное значение "UTF-8". Вероятно, это баг платформы. Но пока ввязываться в переписку с 1С не планирую.

И есть нюанс насчет свойства ЧтениеXML.КодировкаXML - значение этого свойства устанавливается после первого ЧтениеXML.Прочитать(), не сразу после открытия файла.

Вероятно, кто-то скажет, что можно в объявлении переписать тег кодировки. По разным причинам, это для меня не вариант.

Тестировалось/разрабатывалось на 8.3.17.1989, к БСП или типовой конфигурации не имеет отношения.

ЧтениеXML UTF КодировкаXML

См. также

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    139490    771    295    

407

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

45650 руб.

24.04.2015    193694    148    242    

278

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.230.x) и БП 3.0 (3.0.156.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    22692    151    46    

110

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 руб.

03.12.2020    35793    90    62    

85

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    10233    11    8    

13

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Перенос данных из УНФ в УТ 11 | из УНФ в КА 2 | из УНФ в ERP | В продаже с 2019г. | Воспользовались более 39 предприятий! | Предлагаем готовые правила конвертации данных (формат КД 2) для переноса начальных остатков на выбранную дату, а также документов за период и справочной информации | Есть фильтр выгрузки по организациям | Подойдут как для первичного переноса данных из УНФ, так и для регулярного обмена данными | Оперативно обновляем на новые релизы 1С | Постоянно развиваем продукт |

37950 руб.

05.12.2019    43069    43    49    

40

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Перенос данных из КА 1.1 в КА 2 | из КА 1.1 в УТ 11 | Воспользовались более 367 компаний! | В продаже с 2015г. и постоянно развивается | Переносятся все возможные виды документов, начальных остатков и вся справочная информация из "1С:КА 1.1" в "1С:КА 2.х" / "1С:УТ 11" | Разработан в формате КД 2 (правила конвертации данных) | Оперативно обновляем на новые релизы | Фильтр по организациям при выгрузке | Выбор разных алгоритмов выгрузки начальных остатков | Можно проверить перенос до покупки!

45650 руб.

04.12.2015    190710    244    348    

400

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Обработка в продаже с 2018г. | Воспользовались более 56 предприятий! | Перенос кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляем при выходе новых релизов 1С | Работаем над развитием его алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

45650 руб.

29.10.2018    55621    59    104    

59
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Danila-Master 118 25.11.21 14:17 Сейчас в теме
есть некорректность в условиях:
Если первый байт - 255, второй - 254, третий - 0, четвертый - 0

По логике при таком условии, по идее, должно зайти в условие:
ИначеЕсли Буфер[0]=255 И Буфер[1]=254 И Буфер[2]=0 И Буфер[3]=0 Тогда
И вернуться результат: "UTF-32LE"

Но по факту выполнится условие:
ИначеЕсли Буфер[0]=255 И Буфер[1]=254 Тогда
И вернется результат: "UTF-16LE"
2. ImHunter 325 25.11.21 14:21 Сейчас в теме
(1) Пасиб за замечание, гляну.
3. TMV 14 25.11.21 15:30 Сейчас в теме
Но не тут-то было. Парсер начинает возмущаться, что его заставляют открывать файл не в той кодировке, которая прописана в объявлении. В общем, это не рабочий вариант.
Проще прописать в объявлении нужную кодировку, раз она уже определена.
4. ImHunter 325 25.11.21 15:36 Сейчас в теме
(3) Это искажение первичного файла. Теор, могут докопаться.
Ну и влазить в работающий код не хочется - ведь работы на файловом уровне практически нет, все на потоках и двоичных данных.
5. ImHunter 325 25.11.21 15:39 Сейчас в теме
(3) И тогда бы я не придумал финт с ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(...)) ;) А этот финт можно взять на заметку и для каких-то других ситуаций с кодировками.
6. angabanga5 04.09.23 21:05 Сейчас в теме
ахах мало того что УТФ кодировка не читается иногда, иногда надо через нот пад прогонять и кодировки менять на УТФ с ВОМ (чтобы это ни было):
Прикрепленные файлы:
Оставьте свое сообщение