• boost::xml——基本操作以及中文乱码解决方案 (续)


    本博文主要想说明以下两点:

    1.对于上一篇的《boost::xml——基本操作以及中文乱码解决方案》解释,这篇博文基本解决了正确输入输出中英文问题,但是好像还没有解决修改中文出现乱码的问题。

    可以参看这段代码

     1 bool read_xmlW(const std::string &xml,boost::property_tree::wptree &a_wptree)
     2 {
     3     bool rt = true;
     4     boost::mutex::scoped_lock s_lock(m_mutex);
     5     std::wstring wstr;
     6     wsstream.clear();
     7 
     8     wstr = g_codetrans()->utf8_to_utf16(xml);
     9     wsstream << wstr;
    10 
    11     // set facet for std::wstring
    12     std::locale current_locale(std::locale(""), new boost::program_options::detail::utf8_codecvt_facet());
    13 
    14     try
    15     {
    16         //boost::property_tree::read_xml<boost::property_tree::wptree>(wsstream, a_wptree, boost::property_tree::xml_parser::trim_whitespace, current_locale);
    17         boost::property_tree::read_xml<boost::property_tree::wptree>(wsstream, a_wptree, boost::property_tree::xml_parser::trim_whitespace);
    18     }
    19     catch (const std::exception &e)
    20     {
    21 #ifdef _DEBUG
    22         std::cout << "Error:" << typeid(e).name() << ": ";
    23         std::cout << e.what() << std::endl;
    24 #endif // DEBUG
    25         rt = false;
    26     }
    27     return rt;
    28 
    29 }

    注:里面宽字符的a_wptree没有问题,主要是wstr = g_codetrans()->utf8_to_utf16(xml);这个问题。

    此段代码仅供参考。

    2.对于xml写的一点小技巧,这个问题难了我好久,写在下面以供分享。

    先看输出的xml文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <root value="root_test">
     3     <ceng1 value="ceng1_test">
     4         <ceng2 value="0_ceng2"/>
     5         <ceng2 value="1_ceng2"/>
     6         <ceng2 value="2_ceng2"/>
     7     </ceng1>
     8     <ceng1 value="ceng1_test">
     9         <ceng2 value="0_ceng2"/>
    10         <ceng2 value="1_ceng2"/>
    11         <ceng2 value="2_ceng2"/>
    12     </ceng1>
    13     <other1 value="other1_test">
    14         <other2 value="0_other2"/>
    15         <other2 value="1_other2"/>
    16         <other2 value="2_other2"/>
    17     </other1>
    18 </root>

    大家不要小看这几个小小层次,难了我好久,读取容易,写出一模一样的难。难点在于对于节点层次的把握。2个ceng1节点和1个other1节点并列,他们的定节点都是root,他们还有子节点。

    下面附上片段源码:

     1 void TestPtree(std::string &o_xml)
     2 {
     3     tptree pt;//对应第一层的节点(根节点)
     4     tptree cccpt;//对应第二层的节点
     5     for (int j=0 ; j<2 ; j++)
     6     {
     7         tptree cpt;//对应第三层的节点
     8         for (int i=0 ; i<3 ; i++)
     9         {
    10             std::stringstream ss;
    11             ss << i;
    12             string str = ss.str();
    13             str.append("_ceng2");
    14             tptree ccpt;//对应第三层的属性值
    15             ccpt.add<std::string>("<xmlattr>.value", str);
    16             cpt.add_child("ceng2", ccpt);
    17         }
    18         cpt.put<std::string>("<xmlattr>.value", "ceng1_test");//增加第一层的属性
    19         cccpt.add_child("ceng1", cpt);
    20     }
    21     for (int j=0 ; j<1 ; j++)
    22     {
    23         tptree cpt;
    24         for (int i=0 ; i<3 ; i++)
    25         {
    26             std::stringstream ss;
    27             ss << i;
    28             string str = ss.str();
    29             str.append("_other2");
    30             tptree ccpt;
    31             ccpt.add<std::string>("<xmlattr>.value", str);
    32             cpt.add_child("other2", ccpt);
    33         }
    34         cpt.put<std::string>("<xmlattr>.value", "other1_test");
    35         cccpt.add_child("other1", cpt);
    36     }
    37     cccpt.put<std::string>("<xmlattr>.value", "root_test");//增加根节点的属性
    38     pt.add_child("root", cccpt);
    39 
    40 #ifdef CHINESE_CHARSET
    41     std::locale current_locale(locale(""), new boost::program_options::detail::utf8_codecvt_facet());
    42     boost::property_tree::xml_parser::xml_writer_settings<wchar_t> settings(L'	', 1, L"utf-8");
    43 #else
    44     std::locale current_locale;
    45     boost::property_tree::xml_parser::xml_writer_settings<char> settings('	', 1, "utf-8");
    46 #endif
    47 
    48     try
    49     {
    50         boost::property_tree::write_xml(o_xml, pt, current_locale, settings);
    51     }
    52     catch (const std::exception &e)
    53     {
    54         cout << "Error:" << typeid(e).name() << ": ";
    55         cout << e.what() << endl;
    56     }
    57 }

    注:这是主要的代码片段,如果想运行编译通过可以参看我的另一篇博文《boost::xml——基本操作以及中文乱码解决方案》完整源码,地址是:点击这里

  • 相关阅读:
    idea双击打不开没反应的解决办法
    Golang Learn Log #0
    获取请求header的各种方法
    Linux 指令
    Windows下Anaconda的安装和简单使用
    如何把Python脚本导出为exe程序
    C++星号的含义
    仓库盘点功能-ThinkPHP_学习随笔
    详解html中的元老级元素:“table”
    IE在开发工具启动的情况下(打开F12)时 JS才能执行
  • 原文地址:https://www.cnblogs.com/superstargg/p/3781108.html
Copyright © 2020-2023  润新知