rapidjson中string使用的一点小坑

来源:互联网 发布:选购笔记本 知乎 编辑:程序博客网 时间:2024/06/06 07:40


\u00000\u0004T_\u0000\u0000E html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">


使用rapidjson时出现以上问题,1.不是完整的内容,2.多次转义\


bid.AddMember("adm", rapidjson::StringRef(html_snippet.c_str(),html_snippet.size()), allocator);


stringRef(html_snippet.c_str())一开始以为可能可能是字符串结束标志问题,这种方式会调动C的strlen去查找\0判断字符串结束,而指定字符串长度的size后仍然会有\u00000的乱码出现.

使用另一种方式,未出现此种问题:
Value str_val;
str_val.SetString(html_snippet.c_str(),html_snippet.length(),allocator);
bid.AddMember("adm", str_val, allocator);

等价的方式:ringRef(html_snippet.c_str(),Value().SetString(html_snippet.c_str(),allocator).Move(),allocator)

回去仔细查看手册对比源码,这两种方式的差异是StringRef是引用转移,也就是把指针指向了真正内容所在的内存区域。而第二种方式是值copy的方式,会非配内存把字符串复制一份副本。所以问题的根源是html_snippet 是临时局部变量,在document对象序列成json string是html_snippet局部变量已被析构,故转移的方式指向的内存区域是未知的,导致了\00000的出现。


2.多次转义\是嵌套json 对象导致。







原创粉丝点击