Open star2sea opened 4 years ago
@miloyip 从代码看应该是可以的?WriteString 的时候会处理
ASCII
就是 supportUnicode = 0
但是我们需要支持中文,所以ASCII编码解决不了问题,还是需要用UTF-8,但是UTF-8如果开启了supportUnicode = 1的话,会存在数值大于等于128的字节,这个用python和golang的json库解码会出问题
额。。需要用 Unicode 支持中文 和 限制字节值的范围要小于 128,这两个似乎是矛盾的。 “python 和 golang 不能识别大于 128 的字节” 这个情况,能否提供一个案例呢?
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解码时出错了
我目前碰到的问题是这样的,我把test字符串用lua的msgpack模块压缩,压缩后的输出字符串是0xa4,0x74,0x65,0x73,0x74,然后把这个字符串作为value存入一个map,并把map交给rapidjson做序列化,当序列化0xa4字节时,由于UTF-8的supportUnicode=1,所以0xa4会被写入序列化的比特流中,但是对端用golang或者python解码时,会报无法识别0xa4的错误
感谢回复,请问上面这段中提到的逻辑,可以提供一段可运行的代码吗?分享一下具体实现上你们是怎么处理的?
template
struct UTF8 {
typedef CharType Ch;
enum { supportUnicode = 1 };
这里我可以把supportUnicode改为0么,如果supportUnicode = 1,数值大于等于128的字节会保留, 我用其他语言的json模块解码会出错,比如python和golang,它们都不能识别大于128的字节