Boost wptree写入XML编码异常:如何修正符号显示问题?
解决Boost.PropertyTree写XML时的字符转义与Locale问题
首先,咱们来拆解一下你的问题:当locale设为C时,XML输出里的>被转成了>(双重转义),而你期望的是正确的>;同时你尝试设置en_US.UTF-8在Windows上抛出异常,这是因为Windows的Locale命名规则和Unix系系统不一样。
为什么会出现双重转义?
当locale是C时,它默认使用ASCII编码规则。Boost.PropertyTree的XML writer在这种场景下,可能会把>当作需要特殊处理的字符,并且错误地对转义后的&再次转义,最终导致>变成>。要解决这个问题,我们需要使用支持UTF-8的locale,让writer正确识别并处理XML特殊字符。
Windows上Locale设置的坑
你用"en_US.UTF-8"抛出异常,是因为Windows的Locale命名格式和Unix不同:
- Unix系用
en_US.UTF-8 - Windows对应的UTF-8 locale名称是
"English_United States.65001"(65001是UTF-8的代码页),或者部分版本支持"en-US.UTF-8"
不过更可靠的方式是手动创建UTF-8 locale,不依赖系统的Locale名称,避免兼容性问题。
解决方案
这里有两种可靠的修改方式:
方式1:手动创建UTF-8 Locale(推荐)
直接通过std::codecvt_utf8创建支持UTF-8的locale,无需依赖系统Locale名称:
#include <locale> #include <codecvt> // 手动构建UTF-8 locale std::locale utf8_locale(std::locale(), new std::codecvt_utf8<wchar_t>); // 写入XML时使用这个locale boost::property_tree::xml_parser::write_xml( wstringToString(filename), mainTree, utf8_locale, boost::property_tree::xml_writer_make_settings<std::wstring>(' ', 4) );
方式2:使用Windows兼容的UTF-8 Locale名称
如果你想使用系统自带的UTF-8 locale,可以尝试:
// Windows下的UTF-8 locale名称 std::locale utf8_locale("English_United States.65001"); boost::property_tree::xml_parser::write_xml( wstringToString(filename), mainTree, utf8_locale, boost::property_tree::xml_writer_make_settings<std::wstring>(' ', 4) );
如果这个名称不行,可以试试"en-US.UTF-8",不同Windows版本可能支持不同的命名。
额外检查
确保你的wptree中存储的字符串是原始的"abc>def",而不是已经转义过的"abc>def"——如果是后者,即使Locale正确,也会出现双重转义的情况。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

