Tencent / rapidjson

A fast JSON parser/generator for C++ with both SAX/DOM style API
http://rapidjson.org/
Other
14.17k stars 3.52k forks source link

可以关闭UTF-8的supportUnicode选项吗 #1601

Open star2sea opened 4 years ago

star2sea commented 4 years ago

template struct UTF8 { typedef CharType Ch; enum { supportUnicode = 1 };

这里我可以把supportUnicode改为0么,如果supportUnicode = 1,数值大于等于128的字节会保留, 我用其他语言的json模块解码会出错,比如python和golang,它们都不能识别大于128的字节

piratf commented 4 years ago

@miloyip 从代码看应该是可以的?WriteString 的时候会处理

miloyip commented 4 years ago

ASCII 就是 supportUnicode = 0

star2sea commented 4 years ago

但是我们需要支持中文,所以ASCII编码解决不了问题,还是需要用UTF-8,但是UTF-8如果开启了supportUnicode = 1的话,会存在数值大于等于128的字节,这个用python和golang的json库解码会出问题

piratf commented 4 years ago

额。。需要用 Unicode 支持中文 和 限制字节值的范围要小于 128,这两个似乎是矛盾的。 “python 和 golang 不能识别大于 128 的字节” 这个情况,能否提供一个案例呢?

star2sea commented 4 years ago

UTF-8本身可以用变长编码支持中文,但是rapidjson对UTF-8开启了supportUnicode=1,这会导致最终的编码结果里面会有数值大于128的字节存在。正常的UTF-8编码是四种变长形式: 0xxxxxxx: 单字节编码,与ASCII一致 110xxxxx 10xxxxxx:双字节编码 1110xxxx 10xxxxxx 10xxxxxx:三字节编码 11110xxx 10xxxxxx 10xxxxxx:四字节编码 可见某些大于128的字节UFT-8是不支持的 从rapidjson的WriteString方法来看的话,如果开启了supportUnicode=1,那么如果有大于128的字节,都是会原样保留的,这就导致golang的json模块用UTF-8解码时出错了

star2sea commented 4 years ago

我目前碰到的问题是这样的,我把test字符串用lua的msgpack模块压缩,压缩后的输出字符串是0xa4,0x74,0x65,0x73,0x74,然后把这个字符串作为value存入一个map,并把map交给rapidjson做序列化,当序列化0xa4字节时,由于UTF-8的supportUnicode=1,所以0xa4会被写入序列化的比特流中,但是对端用golang或者python解码时,会报无法识别0xa4的错误

piratf commented 4 years ago

感谢回复,请问上面这段中提到的逻辑,可以提供一段可运行的代码吗?分享一下具体实现上你们是怎么处理的?