Iva*_*lok 5 boost xml-encoding xml-parsing
我正在尝试使用 Boost 函数read_xml和write_xml读取/写入 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>
Run Code Online (Sandbox Code Playgroud)
这是输出:
<?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>
Run Code Online (Sandbox Code Playgroud)
这是我的 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);
Run Code Online (Sandbox Code Playgroud)
我需要使用原始文件中相同的编码来读取和重写该文件。我还尝试使用以下方法更改区域设置:
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);
Run Code Online (Sandbox Code Playgroud)
但我得到了同样的结果。
如何使用 Boost 函数使用原始文件编码进行读写?
谢谢
您可以通过编写器设置传递编码:
auto settings = boost::property_tree::xml_writer_make_settings<std::string>(
'\t', 1, "windows-1252");
Run Code Online (Sandbox Code Playgroud)
当然,确保键/值实际上是 latin1/cp1252 兼容的(只要您从源文件中读取所有信息,这就有意义;但是,在将用户输入分配给属性树节点时,您必须小心;您可能需要首先从输入编码转换为 cp1252)。
| 归档时间: |
|
| 查看次数: |
3765 次 |
| 最近记录: |