本文所使用的boost为1.55版本。
使用boost的ptree输出json的时候,中文会被转换为\uxxxx的utf8编码形式,json的标准中对于中文是转换为\uxxxx的utf16编码形式。
boost的这种utf8的格式大多数的库都无法正常解析,除了boost自己。也不知boost为什么非要转成这种冷门格式,怎么和其他库通信啊。
而boost也没有留任何的配置接口来应对这种情况,想解决就必须改ptree的源码。
boost的boost\property_tree\detail目录下有一个json_parser_write.hpp文件,这里实现了json的输出。
其中有一个create_escapes函数,这个函数将字符串将中文转换为了\uxxxx的utf8编码。create_escapes函数在write_json_helper函数中被调用了两次。
想解决这个问题最简单的解决方法就是把这个函数的调用去掉。但是这样会影响到所有使用了这份boost库的程序,而通常boost库都是多个项目共享的。
所以比较好的方式就是给外层的调用函数加一个默认参数,如果这个参数被设置那么就不调用create_escapes函数。
这样因为默认参数的存在,其他使用了ptree库的代码依然会对中文进行转换,不影响其他程序。
当然了,这里取消create_escapes函数的调用只是会将中文原样输出,如果想要获取标准的utf16编码形式的输出,需要自己再写一个函数来转换,然后根据传入的参数选择调用。