boost.property_tree读取中文乱码问题正确的解决方式
Posted ye_ming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost.property_tree读取中文乱码问题正确的解决方式相关的知识,希望对你有一定的参考价值。
开发项目的时候在使用boost,在宽字符下遇到中文乱码问题
上网上看大家都是先转成utf8在进行解析的,例如:
http://blog.csdn.net/hu_jiangan/article/details/49945373 中
void Init(const wstring& fileName, wptree& ptree) { std::wifstream f(fileName); std::locale utf8Locale(std::locale(), new std::codecvt_utf8<wchar_t>); f.imbue(utf8Locale); //先转换一下 //用wptree去解析 property_tree::read_xml(f, ptree); }
他的思路没有问题,并且还用了STL库,避免了boost的繁琐。
但是在boost中对read_xml定义里包含了对xml的转换
1 template<class Ptree> 2 void read_xml(const std::string &filename, 3 Ptree &pt, 4 int flags = 0, 5 const std::locale &loc = std::locale()) 6 { 7 BOOST_ASSERT(validate_flags(flags)); 8 std::basic_ifstream<typename Ptree::key_type::value_type> 9 stream(filename.c_str()); 10 if (!stream) 11 BOOST_PROPERTY_TREE_THROW(xml_parser_error( 12 "cannot open file", filename, 0)); 13 stream.imbue(loc); 14 read_xml_internal(stream, pt, flags, filename); 15 }
所以他对xml进行了两次utf8的转换
正确的代码其实只需要两行就可以完成
void Init(const wstring& fileName, wptree& ptree) { std::locale utf8Locale(std::locale(), new std::codecvt_utf8<wchar_t>); boost::property_tree::read_xml(filename, ptree, 0, utf8Locale); }
以上是关于boost.property_tree读取中文乱码问题正确的解决方式的主要内容,如果未能解决你的问题,请参考以下文章
使用 boost::property_tree 读取 ini 文件不适用于 A.x 形式的子级
boost::property_tree::json_parser::read_json 如果路径包含西里尔字符则无法读取文件
CMake,JNI 提升读取 json 文件 - Android