2014-03-06 29 views
3
#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文件:写作Unicode字符串为XML加速属性树

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

现在我更换s值与非ASCII字符:

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

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

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

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

回答

0

我认为你不应该使用std :: locale()而是utf8区域设置。在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); 

它在我的环境中工作正常。

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