Увеличить чтение / запись XML-файла: как изменить кодировку символов?
Я пытаюсь читать / писать XML-файл, используя функции Boost read_xml и write_xml. Исходная кодировка XML-файла - "windows-1252", но после операций чтения / записи кодировка стала "utf-8".
Это оригинальный файл XML:
<?xml version="1.0" encoding="windows-1252" standalone="no" ?>
<lot>
<name>Lot1</name>
<lot_id>123</lot_id>
<descr></descr>
<job>
<name>TEST</name>
<num_items>2</num_items>
<item>
<label>Item1</label>
<descr>Item First Test</descr>
</item>
<item>
<label>Item2</label>
<descr>Item Second Test</descr>
</item>
</job>
</lot>
И это выходной:
<?xml version="1.0" encoding="utf-8"?>
<lot>
<name>Lot1</name>
<lot_id>123</lot_id>
<descr></descr>
<job>
<name>TEST</name>
<num_items>2</num_items>
<item>
<label>Item1</label>
<descr>Item First Test</descr>
</item>
<item>
<label>Item2</label>
<descr>Item Second Test</descr>
</item>
</job>
</lot>
Это мой код C++ (просто тестовый код):
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
using boost::property_tree::ptree;
ptree xmlTree;
read_xml(FILE_XML, xmlTree);
for (auto it = xmlTreeChild.begin(); it != xmlTreeChild.end();)
{
std::string strItem = it->first.data();
if (strcmp(strItem.c_str(), "item") == 0)
{
std::string strLabel = it->second.get_child("label").data();
if (strcmp(strLabel.c_str(), "item3") != 0)
{
it = xmlTreeChild.erase(it);
}
}
++it;
}
auto settings = boost::property_tree::xml_writer_make_settings<std::string>('\t', 1);
write_xml(FILE_XML, xmlTree, std::locale(), settings);
Мне нужно прочитать и переписать файл, используя ту же кодировку из исходного файла. Я также попытался изменить настройки Locale, используя:
std::locale newlocale1("English_USA.1252");
read_xml(FILE_XML, xmlTree, 0, newlocale1);
...
auto settings = boost::property_tree::xml_writer_make_settings<std::string>('\t', 1);
write_xml(FILE_XML, xmlTree, newlocale1, settings);
но у меня такой же результат.
Как я могу иметь возможность читать и писать, используя оригинальную кодировку файлов, с функциями Boost?
Спасибо
3 ответа
Вы можете передать кодировку через настройки писателя:
auto settings = boost::property_tree::xml_writer_make_settings<std::string>(
'\t', 1, "windows-1252");
Конечно, убедитесь, что ключ / значения на самом деле совместимы с latin1/cp1252 (это имеет смысл, пока вы читаете всю информацию из исходного файла; однако вы должны быть осторожны, например, при назначении пользовательского ввода узлу дерева свойств; вы может потребоваться сначала преобразовать из входной кодировки в cp1252).
Чтобы решить проблему, с которой вы столкнулись, вы должны заменить эту строку:
read_xml(FILE_XML, xmlTree);
с
read_xml(FILE_XML,
xmlTree,
boost::property_tree::xml_parser::trim_whitespace);
насколько я знаю, вашу проблему нельзя решить, только изменив настройки функции write_xml .
Я попробовал и сработало: когда я сравниваю файлы, игнорируя пробелы, входной и выходной xml-файлы идентичны.
Вы также можете записать в поток строки следующим образом:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
boost::property_tree::ptree pt;
std::ostringstream oss;
write_xml(
oss, pt,
boost::property_tree::xml_writer_make_settings<char>(
'\t', 0, "ASCII"));