rapidjson中string使用的一點小坑
阿新 • • 發佈:2019-01-31
\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 物件導致。