0
На рассмотрении

Как изменить кодировку XML-файла на UFT-8?

Игорь Шалдин 2 года назад в Прочее обновлен 2 года назад 20

Здравствуйте.

Делаю выгрузку в Росбанк в формате XML.

Пролог файла-образца ( s_Росбанк_реестр.xml ) выглядит так:

<?xml version="1.0" encoding="UTF-8"?>

Посмотрел кодировку файла. Действительно - UTF-8.

КЗ сохраняет файл в кодировке windows-1251, и сообщает об этом в прологе:

<?xml version="1.0" encoding="windows-1251"?>

Как сохранить файл в кодировке UTF-8 и сделать запись об этом в прологе?

На рассмотрении

Добрый день.

Пример можно взять в ..SCRIPT\forms\egisz.S или PilotFSS.S

В скрипт добавил: 

toUTF8(st)
{
string s = "";
FreeSpaceString(st,3,"");
CP866ToUTF8(st,s);
return static_cast_to_string(s);
}

В скрипте поменял:

CreateXMLobj()
// Создание XML файла
{
UnloadScriptModule("msxml");
LoadScriptModule("msxml");
// var XMLDoc = CreateXML(""); // Было
var XMLDoc = CreateXML(toUTF8("version=\"1.0\" encoding=\"UTF-8\"")); // Стало
return XMLDoc;
}

На выходе получил XML-файл:

Т.е. в прологе стало всё как надо.

Теперь пытаюсь поменять кодировку корневого элемента:

При формировании файла получаю ошибку:

Что делаю не так?

Скрипт у вас в какой кодировке?

Можете его выложить..

в toUTF8() должна прилетать строка в дос кодировке (866)

Скрипт у вас в какой кодировке?

ANSI

Можете его выложить.

Это немного поправленный sbr_xml.S (правил только часть, касающуюся структуры XML-файла).

в toUTF8() должна прилетать строка в дос кодировке (866)

Уже понял. Не смог поправить.

ANSI

тогда надо так:

var XMLDoc1 = CreateElemXML(XMLDoc,toUTF8(AnsiToOem("СчетаПК")));

или поправить toUTF8 так:

toUTF8(st)
{
string s = "";
FreeSpaceString(st,3,"");
CP866ToUTF8(AnsiToOem(st),s);
return static_cast_to_string(s);
}

Так уже пробовал. Не помогло.

Вот скрипт: RosBank_xml.S

Скрипт у вас в ДОС кодировке.

Поэтому AnsiToOem надо убрать

Да я уже как только не пробовал. Всё равно, если присутствуют русские буквы, получаю ошибку:

Скрипт у вас в ДОС кодировке.

Странно... Notepad++ действитено показывает ДОС-кодировку, а вот блокнот - ANSI:

Попробовал определить вордом. Тоже ДОС. Вывод - блокнот врёт.

Ну вообщем так..

  1. Создаем xml с указанием кодировки: CreateXML(toUTF8("version=\"1.0\" encoding=\"UTF-8\""))
  2. При создании элемента - нужно передавать строку в win кодировке: CreateElemXML(XMLDoc,OemToAnsi("СчетаПК"))
  3. При сохранении в файл использовать метод SaveFileXML  (SaveFileXmlFine на UTF не рассчитан)

Пример кода (скрипт в DOS кодировке):

TestUTF()
{
  UnloadScriptModule("msxml");
  LoadScriptModule("msxml");

  var XMLDoc = CreateXML(toUTF8("version=\"1.0\" encoding=\"UTF-8\""));
  var rootNode= CreateElemXML(XMLDoc,OemToAnsi("СчетаПК"));

  XMLDoc .documentElement=rootNode;

  SaveFileXML(XMLDoc,"D:\\Postavki\\123.xml");
  UnloadScriptModule("msxml");
}
При сохранении в файл использовать метод SaveFileXML (SaveFileXmlFine на UTF не рассчитан)

При использовании метода SaveFileXML файл сохраняется в кодировке UTF-8, но все теги в нем, почему-то, выстраиваются в одну строку:

<?xml version="1.0" encoding="UTF-8"?>
<СчетаПК ДатаФормирования="2022-01-27" НомерДоговора="11111" ДатаДоговора="2020-02-10" НаименованиеОрганизации="Предприятие" ИНН="6600000003" РасчетныйСчетОрганизации="11111111111111111111" БИК="222222222" ИдПервичногоДокумента="C59B8A89-49D3-4a94-826B-E9233FCE4892"><ЗачислениеЗарплаты><Сотрудник Нпп="1"><Фамилия>Петров<Имя>Сергей<Отчество>Петрович<ОтделениеБанка>8615<ЛицевойСчет>12345678901234567891<Сумма>35721.00<КодВалюты>643<ОбщаяСуммаУдержаний><КонтрольныеСуммы><КоличествоЗаписей>1<СуммаИтого>35721.00

    Ну он же не Fine :)

    как говорится: "вам шашечки или ехать?"..

    Я правильно понимаю, что в XML расположение тегов не играет роли? Ну в смысле - что "в стобик", что "в строку" - однофигственно?

    На рассмотрении

    йес, для "машины" все равно..

    даже порядок не важен, главное чтобы вложенность соблюдалась..

    Выложите , пожалуйста, то что получится.

    Для потомков..

    Сервис поддержки клиентов работает на платформе UserEcho