使用Boost属性树将Unicode字符串写入XML

时间:2014-03-06 09:22:20

标签: c++ xml boost boost-propertytree

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <string>

using namespace std;

int main()
{
    wstring s(L"Alex");

    boost::property_tree::wptree mainTree;
    boost::property_tree::wptree dataTree;

    dataTree.put(L"Name", s);
    mainTree.add_child(L"Data", dataTree);
    boost::property_tree::xml_writer_settings<wchar_t> w(L' ', 3);

    try
    {
        write_xml("Data.xml", mainTree, std::locale(), w);
    }
    catch(boost::property_tree::xml_parser_error& error)
    {
        cout << error.message().c_str() << endl;
        return 1;
    }

    cout << "OK" << endl;
    return 0;
}

此程序打印正常并按预期写入XML文件:

<?xml version="1.0" encoding="utf-8"?>
<Data>
   <Name>Alex</Name>
</Data>

现在我用非ASCII字符替换s值:

    //wstring s(L"Alex");
   wstring s(L"Алекс");

执行程序时,它会打印:write error,XML文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Data>
   <Name>

我该如何解决这个问题?我需要使用Boost属性树将非ASCII数据写入XML文件。

2 个答案:

答案 0 :(得分:0)

我认为你不应该使用std :: locale(),而应该使用 utf8 locale 。在boost-1.51中,您可以使用 boost / detail / utf8_codecvt_facet.ipp 来制作utf8语言环境。

首先,像这样包括utf8_codecvt_facet.ipp:

#define BOOST_UTF8_BEGIN_NAMESPACE \
namespace boost { namespace detail {
#define BOOST_UTF8_DECL
#define BOOST_UTF8_END_NAMESPACE }}
#include <boost/detail/utf8_codecvt_facet.ipp>
#undef BOOST_UTF8_END_NAMESPACE
#undef BOOST_UTF8_DECL
#undef BOOST_UTF8_BEGIN_NAMESPACE

然后,创建utf8语言环境并使用语言环境编写xml。

std::locale utf8_locale(std::locale(), new boost::detail::utf8_codecvt_facet);
write_xml("Data.xml", mainTree, utf8_locale, w);

它在我的环境中运行良好。

答案 1 :(得分:0)

使用Boost 1.55和VS2012我最终写下来并获得有效的unicode字符:

auto settings = xml_writer_make_settings<wchar_t>(L' ', 2, L"utf-8");
std::locale utf8bom(std::locale(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::generate_header>);
write_xml(strFileName, xmlTree, utf8bom, settings);