std::string转json时多了\u0000【jsoncpp库】

在将std::string转换为json时遇到一个错误,问题源于长度计算错误,导致json中出现字符。原本长度应为5,但误设为6,使得数据中包含了NULL字符。理解std::string的size不包含结束符,并正确管理字符串长度,是避免此类问题的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到了一个问题:在给json对象转换为字符串时,发现多了一个\u0000的字符,导致后端的功能异常。

源代码如下:


            Json::Value info;

            const char* p = "12345";

            const size_t length = 6;

            std::string data(p, length);
            info["a"] = data;

            std::string json = info.toStyledString();

上面的代码肉眼很难看出来问题,以为是正常的。调试就会发现,json中多了一个\u0000

这个\u0000就是utf-8的NULL字符。

Unicode Character 'NULL' (U+0000)

最开始以为是jsoncpp的bug,网上一顿找,发现了这个文章:

json-cpp / Bugs / #47 a problem with \u0000 character

简单来说就是jsoncpp老版本有个问题。然后就没有使用jsoncpp了,直接使用字符串拼接成了一个json字符串,这下应该就可以了吧,后来发现还是有问题。

然后再继续排查原因。发现上面的代码中length写大了,应该是5。

length是6的时候我们直接调试不好看出问题,因为VS显示的是看起来是正确的呀。

 

std::string中的size是不包含结束字符的,也就是相当于strlen得出的长度。但是std::string也可以表示一个缓冲区,里头可以用很多个结束字符,这时,size就不像是通过strlen求字符串的长度了。这时缓冲区有多长,size就是多长。

比如:

const char* p = "123\0456\0789"

std::string data(p, 11);

data就是一个普通的缓冲区,这样使用是为了方便管理,不用一个byte*的缓冲区,一个长度的size_t,而且内存管理也很方便。

回到刚才的问题,size是6时,data的真实数据是这样的:

 我们需要看的数据长度应该是7个,data[6]才是真正的结束符,而data[5]被当做了一个普通字符,但是VS显示的时候把data[5]看成了结束符,因为他是NULL。

所以info.toStyledString调用时,就把data[5]转成了\u0000,这个是utf-8表示的NULL对应的显示字符。

结论:

多了一个\u0000是因为字符串的长度多了1导致的。

参考资料:

Unicode Character 'NULL' (U+0000)

json-cpp / Bugs / #47 a problem with \u0000 character

这个同学也遇到了这个问题,但是似乎没有找到原因。

string转json多了\u0000_xiaopang_love_study的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值