- Главная
- Ошибки в XML-УПД
- Кодировка windows-1251 в XML-УПД: почему непонятные символы и как исправить
Кодировка windows-1251 в XML-УПД: почему непонятные символы и как исправить
Почему XML-УПД открывается с непонятными символами или не принимается в ЭДО, какая кодировка нужна по формату и как пересохранить файл в windows-1251.
Вы открываете XML-файл УПД, а вместо «Номер» видите «РќРѕРјРµСЂ». Или УПД XML не открывается вовсе: браузер ругается на ошибку разбора, а оператор ЭДО пишет, что файл повреждён. В большинстве таких случаев виновата кодировка. Разберём, какая кодировка нужна XML-УПД, как её проверить и как исправить файл, не испортив его окончательно.
Проблемы с кодировкой — одни из самых коварных среди тех, что входят в частые ошибки в XML-файле УПД: внешне документ может выглядеть почти нормально, а система его не принимает.
Какая кодировка нужна XML-УПД
XML-файлы УПД формата 5.03 формируются в кодировке windows-1251. Это прописано в первой строке документа:
<?xml version="1.0" encoding="windows-1251"?>
<Файл ИдФайл="ON_NSCHFDOPPR_..." ВерсФорм="5.03" ВерсПрог="...">
Заголовок encoding — это обещание: «байты этого файла нужно читать как windows-1251». Программа, открывающая файл, верит заголовку. Если реальные байты записаны в другой кодировке, например в UTF-8, русские буквы превращаются в мусор, а строгий XML-парсер может отказаться читать файл вообще.
Поэтому важно не просто «сохранить в windows-1251», а чтобы совпадали две вещи: фактическая кодировка байтов и значение в заголовке.
Почему не UTF-8
UTF-8 — более современная и универсальная кодировка, и многие редакторы используют её по умолчанию. Но формат УПД исторически опирается на windows-1251, и учётные программы, и операторы ЭДО ждут именно её. Кодировка, отличная от предусмотренной форматом, — риск отказа при загрузке, даже если сам XML корректен.
Ограничение у windows-1251 одно: это однобайтовая кодировка с набором из 256 символов. Кириллица, латиница, цифры и основная пунктуация в ней есть, а вот многих специальных знаков нет.
| Символ | Есть в windows-1251 | Что делать |
|---|---|---|
| Русские и латинские буквы, цифры | Да | Ничего |
| «Ёлочки», длинное тире, №, € | Да | Можно оставить |
| Знак рубля ₽ | Нет | Писать «руб.» |
| Эмодзи, иероглифы | Нет | Удалить из наименований |
| Буквы с диакритикой (ą, ș, ğ) | Частично | Заменить на латиницу без знаков |
Признаки проблемы с кодировкой
| Что вы видите | Что, скорее всего, произошло |
|---|---|
| «РќРѕРјРµСЂ», «РћРћРћ» вместо русских букв | Файл в UTF-8, а читается как windows-1251 |
| «Íîìåð», «ÎÎλ | Файл в windows-1251, а читается как другая однобайтовая кодировка |
| Ромбики с вопросом «�» | Файл в windows-1251, а читается как UTF-8 |
| Браузер: ошибка XML, invalid byte, encoding error | Байты не соответствуют заголовку |
| Оператор ЭДО: файл не читается или повреждён | То же, или файл обрезан при передаче |
| Вопросительные знаки «???» вместо части символов | Символов нет в windows-1251, они потеряны при сохранении |
Обратите внимание: «кракозябры» в окне редактора ещё не значат, что файл испорчен. Возможно, редактор просто открыл его не в той кодировке, а байты в порядке. Поэтому не спешите сохранять: сначала переключите отображение на windows-1251 и посмотрите, стал ли текст читаемым.
Иногда файл открывается нормально у вас, но не у контрагента. Это значит, что ваш редактор угадал кодировку правильно, а его программа доверилась заголовку.
Откуда берётся проблема
- Файл открыли и сохранили в редакторе, который по умолчанию пишет UTF-8. Заголовок остался прежним, а байты поменялись.
- Файл собрали скриптом или выгрузкой, где кодировка вывода не задана явно.
- Текст скопировали из Word, сайта или мессенджера: туда попали «ёлочки», длинные тире, символы валют, эмодзи. Часть из них в windows-1251 есть, часть нет, и при сохранении они превращаются в «?».
- Файл прошёл через почту или облако, которое пересохранило его как текст.
Как проверить кодировку файла
Способ 1. Посмотреть заголовок. Откройте файл в любом редакторе и прочитайте первую строку. Там должно быть encoding="windows-1251".
Способ 2. Посмотреть фактическую кодировку. В Notepad++ она показана в строке состояния внизу окна и в меню «Кодировки». В VS Code — в правом нижнем углу. Если там написано UTF-8, а в заголовке windows-1251, вы нашли проблему.
Способ 3. Открыть в браузере. Перетащите XML в окно браузера. Если файл корректен, вы увидите дерево с нормальным русским текстом. Ошибка разбора или «кракозябры» — повод разбираться дальше.
Способ 4. Перевести в таблицу. Если нужно не столько починить файл, сколько прочитать, что в нём, удобно перевести УПД из XML в Excel: сервис прочитает документ и разложит реквизиты и строки товаров по листам. Если файл прочитать не удаётся, это тоже диагноз.
Как исправить в блокноте и редакторе
Прежде всего сделайте копию исходного файла и работайте с ней.
Notepad++
- Откройте файл.
- Если текст читается нормально, но кодировка в строке состояния — UTF-8, выберите в меню кодировок преобразование в windows-1251 (кириллица). Важно именно преобразовать, а не просто «переключить отображение».
- Если текст — «кракозябры», сначала выберите правильную кодировку для отображения (UTF-8), убедитесь, что текст стал читаемым, и только потом преобразуйте в windows-1251.
- Проверьте первую строку:
encoding="windows-1251". - Сохраните. Имя файла не меняйте.
VS Code
- Нажмите на название кодировки в правом нижнем углу.
- Выберите «Reopen with Encoding» и укажите кодировку, в которой текст читается.
- Снова нажмите на кодировку, выберите «Save with Encoding» и Windows 1251.
- Проверьте заголовок и сохраните.
Стандартный Блокнот Windows
В новых версиях Блокнота кодировку можно выбрать в окне «Сохранить как», но вариант windows-1251 там обычно назван «ANSI» и зависит от региональных настроек системы. Для XML-УПД это ненадёжный инструмент: лучше использовать Notepad++ или VS Code.
Нестандартный заголовок
Иногда байты в порядке, а заголовок записан иначе: encoding="cp1251", encoding="Windows-1251" или его нет вовсе (тогда парсер по умолчанию считает файл UTF-8). Приведите первую строку к виду <?xml version="1.0" encoding="windows-1251"?>, сохранив кодировку байтов.
Если символы уже потеряны
Если в файле стоят «???» вместо части текста, преобразование не поможет: информация утеряна. Восстановите текст вручную или, что надёжнее, сформируйте документ заново из исходных данных.
После любой правки проверьте две вещи: что имя файла осталось равным ИдФайл (об этом — статья Имя файла не соответствует ИдФайл: причины и исправление) и что файл проходит схему ФНС.
Как не допускать: генерация файла сервисом
Проблемы с кодировкой почти всегда появляются при ручной работе с XML. Чтобы их не было:
- не открывайте XML-УПД на редактирование без необходимости, только на чтение;
- если правка нужна, используйте редактор, где кодировка видна и задаётся явно;
- не вставляйте в наименования товаров символы из Word и с сайтов: эмодзи, экзотические кавычки, знаки валют;
- формируйте файл инструментом, который пишет windows-1251 сам.
Наш конвертер сохраняет XML в windows-1251 с правильным заголовком и сразу называет его по ИдФайл. Если нужно изменить готовый документ, переведите его в таблицу, поправьте и соберите обратно: кодировка при этом не пострадает.
Если кодировка в порядке, а файл всё равно не принимают, посмотрите, как исправить ошибки УПД других типов: имя файла, схема, реквизиты, коды маркировки. А чтобы с самого начала получать корректный файл, используйте конвертер УПД Excel в XML.