В рамках текущей работы разбираю много файлов 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, КодировкаИсточника. Казалось бы, этими свойствами вполне себе можно воспользоваться для определения необходимости перекодировки.
Но тут тоже засада. Похоже, что парсер всегда обозначает, что читает UTF. Т.е., при чтении файла в Windows-кодировке, свойство ЧтениеXML.КодировкаИсточника имеет некорректное значение "UTF-8". Вероятно, это баг платформы. Но пока ввязываться в переписку с 1С не планирую.
И есть нюанс насчет свойства ЧтениеXML.КодировкаXML - значение этого свойства устанавливается после первого ЧтениеXML.Прочитать(), не сразу после открытия файла.
Вероятно, кто-то скажет, что можно в объявлении переписать тег кодировки. По разным причинам, это для меня не вариант.
Тестировалось/разрабатывалось на 8.3.17.1989, к БСП или типовой конфигурации не имеет отношения.