提升读写XML文件功能:如何更改字符编码?

5
我会尽力帮助您进行翻译。以下是有关IT技术的内容,并使用Boost函数读取/写入XML文件:read_xmlwrite_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>
    &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;
  <name>Lot1</name>
  <lot_id>123</lot_id>
  <descr></descr>
  <job>
    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;  
    <name>TEST</name>
    <num_items>2</num_items>
    <item>
      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;    
      <label>Item1</label>
      <descr>Item First Test</descr>
    </item>
    <item>
      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;    
      <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个回答

1
您可以通过编写器设置传递编码:

auto settings = boost::property_tree::xml_writer_make_settings<std::string>(
    '\t', 1, "windows-1252");

当然,确保键/值实际上是latin1/cp1252兼容的(只要您从源文件中读取所有信息,这就有意义;但是在将用户输入分配给属性树节点时,请注意;您可能需要先将输入编码转换为cp1252)。 Live On Coliru 的链接。

0
为了解决您遇到的问题,您需要替换这行代码:
read_xml(FILE_XML, xmlTree); 

使用

read_xml(FILE_XML, 
         xmlTree, 
         boost::property_tree::xml_parser::trim_whitespace); 

据我所知,仅通过修改write_xml函数的设置无法解决您的问题。
我尝试了一下,当我忽略空格比较文件时,输入和输出的XML文件是相同的。

-1

你也可以按照以下方式将内容写入字符串流中:

#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"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接