- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
std::string text = "á";
“á”是两个字节的字符(假设是 UTF-8 编码)。
所以下一行打印 2。
std::cout << text.size() << "\n";
但 std::cout
仍能正确打印文本。
std::cout << text << "\n";
我将 text
传递给 boost::property_tree::ptree
然后传递给 write_json
boost::property_tree::ptree root;
root.put<std::string>("text", text);
std::stringstream ss;
boost::property_tree::json_parser::write_json(ss, root);
std::cout << ss.str() << "\n";
结果是
{
"text": "\u00C3\u00A1"
}
text 等于“á”,不同于“á”。
是否可以在不切换到 std::wstring
的情况下解决这个问题?是否有可能改变库 (boost::property_tree::ptree
) 可以解决这个问题?
最佳答案
我找到了一些解决方案。通常,您需要为 [Ch=Char]
指定 boost::property_tree::json_parser::create_escapes
模板,以提供您的“特殊场合无错误转义”。
JSON 标准假设所有的字符串都是 UTF-16 编码的,使用“\uXXXX”转义,但是一些库支持使用“\xXX”转义的 UTF-8 编码。如果 JSON 文件可以用 UTF-8 编码,您可以传递所有高于 0x7F 的字符,这是为了原始功能。
我在使用 boost::property_tree::json_parser::write_json
之前放置了这段代码。它来自boost_1_49_0/boost/property_tree/detail/json_parser_write.hpp
:
namespace boost { namespace property_tree { namespace json_parser
{
// Create necessary escape sequences from illegal characters
template<>
std::basic_string<char> create_escapes(const std::basic_string<char> &s)
{
std::basic_string<char> result;
std::basic_string<char>::const_iterator b = s.begin();
std::basic_string<char>::const_iterator e = s.end();
while (b != e)
{
// This assumes an ASCII superset. But so does everything in PTree.
// We escape everything outside ASCII, because this code can't
// handle high unicode characters.
if (*b == 0x20 || *b == 0x21 || (*b >= 0x23 && *b <= 0x2E) ||
(*b >= 0x30 && *b <= 0x5B) || (*b >= 0x5D && *b <= 0xFF) //it fails here because char are signed
|| (*b >= -0x80 && *b < 0 ) ) // this will pass UTF-8 signed chars
result += *b;
else if (*b == char('\b')) result += char('\\'), result += char('b');
else if (*b == char('\f')) result += char('\\'), result += char('f');
else if (*b == char('\n')) result += char('\\'), result += char('n');
else if (*b == char('\r')) result += char('\\'), result += char('r');
else if (*b == char('/')) result += char('\\'), result += char('/');
else if (*b == char('"')) result += char('\\'), result += char('"');
else if (*b == char('\\')) result += char('\\'), result += char('\\');
else
{
const char *hexdigits = "0123456789ABCDEF";
typedef make_unsigned<char>::type UCh;
unsigned long u = (std::min)(static_cast<unsigned long>(
static_cast<UCh>(*b)),
0xFFFFul);
int d1 = u / 4096; u -= d1 * 4096;
int d2 = u / 256; u -= d2 * 256;
int d3 = u / 16; u -= d3 * 16;
int d4 = u;
result += char('\\'); result += char('u');
result += char(hexdigits[d1]); result += char(hexdigits[d2]);
result += char(hexdigits[d3]); result += char(hexdigits[d4]);
}
++b;
}
return result;
}
} } }
我得到的输出:
{
"text": "aáb"
}
函数 boost::property_tree::json_parser::a_unicode
在将转义的 unicode 字符读取为有符号字符时也有类似的问题。
关于c++ - boost::property_tree::json_parser 和两个字节宽的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10260688/
我需要在我的程序中使用 boost::property_tree。现在我很难弄清楚如何将它与自定义路径类型一起使用。我想要的路径类型是 Framework::CommonClientServer::I
如何在循环数组时向属性树添加节点? 这可能是一件简单的事情,但我只是不明白如何使用 boost_property_tree。 我有一组值,我想将其添加到属性树并将其输出为 xml。如果我对节点进行硬编
请考虑两个“boost::property_tree”-s。 ptree1: { "node1" : 1, "node_that_only_appears_in_this_one" :
我正在使用 boost::property_tree 从/向文件加载/保存一组参数。其中许多参数是枚举(不同类型)。所以我需要一种从 boost::property_tree 获取枚举的方法(即将字符
我想使用 boost property_tree 解析下面的 xml 结构。 我能够解析上面 xml 的第一
是否可以在 boost 属性树中存储指向对象的指针,然后使用迭代器检索数据?我正在尝试做类似的事情: property_tree::ptree pt; pt.put("1.2.3.4", new My
感谢 Boost::Property_Tree,我正在尝试配置我的 XML 文件。我想要的聊天是: 10 我所拥有的是: first>10 我发现我不得不使用 boost::property_
我需要从文件中读取属性以影响程序行为。看起来 boost::property_tree 会做得很好。但是,我想知道在获取不同类型的值时,库是否可能会多次读取文件? 出于性能原因,我希望它只有一次。大多
我正在加载一个带有 boost property_tree 的 ini 文件。我的 ini 文件主要包含“简单”类型(即字符串、整数、 double 等),但我确实有一些值表示数组。 [Example
我的 JSON 是这样的: { "apps":[ { "id":"x", "val":"y", } ]
我发现 boost::property_tree::ptree 有巨大的内存开销。我的估计是一个空的 ptree 大约有 150 个字节,并且,放入 ptree 中的任何条目至少增加了 150 个字节
我想要的是这样的: Mr. Heik 37/100
我正在读取 xml 文件并存储到 boost::property_tree::ptree pt(object) 中。 我正在尝试使用在 ptree_serialization.hpp 中定义的方法 s
考虑以下示例: #include #include typedef boost::property_tree::ptree PT; struct Foo { int bar; in
假设我有两个 XML: foo foo 有没有办法在不指定绝对路径的情况下使用属性树从两个 xml 中提取 my_value? 目前我能做的最好的是: std::string first("some.
我正在类成员函数中执行 ptree.put()。 class Writer{ private: boost::property_tree::ptree ptree_; public:
我正在尝试使用显示的方法从 boost::property_tree 中读取数组数据 in this question .在该示例中,数组首先作为字符串读取,转换为字符串流,然后读入数组。在实现该解决
我正在寻找与 boost::property_tree 非常相似的结构.但是它应该更加类型安全,例如我想在我这样做时得到一个异常(exception): #include int main() {
我需要解析一些 INI 文件。为此,我尝试使用 boost::property_tree,但在我的系统中不允许出现异常。 如何在使用 boost::property_tree 时禁用异常支持? 如果没
如何从 boost::property_tree 中获取枚举? 这是我的“非工作”示例。 配置文件 EMISSION::EMIT1 42 main.cpp #include #inclu
我是一名优秀的程序员,十分优秀!