protobuffer java中文乱码怎么解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了protobuffer java中文乱码怎么解决相关的知识,希望对你有一定的参考价值。
protobuf支持非UTF8字符串protobuf规范string类型是必须是UTF8字符,但在C/C++中可以直接调用set方法设置任意编码方式的字符串,也可以直接取得对应字符串,但在控制台中会打印出编码不是UTF8字符的错误信息.
查看protobuf源代码发现是在wire_format.h中有一函数VerifyUTF8String()里进行编码判断的,而且有一宏定义GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED可以取消此错误信息.估计google当初开发时用的是std::string类型,并没有编码方面的强制要求,只是在跨平台时没有统一编码容易引起问题,才统一使用UTF8方式传送字符串.
但像Java,Python缺省就是支持UNICODE,在protobuf库中就已经做了转换或检测,可以修改相关代码不做此转换或检测.
如python中修改lib中的protobufxxx.egg中的decoder.py的StringDecoder()方法,将value.append(local_unicode(buffer[pos:new_pos], 'utf-8'))
改为value.append(buffer[pos:new_pos])
,将field_dict[key] = local_unicode(buffer[pos:new_pos], 'utf-8')
改为field_dict[key] = buffer[pos:new_pos]
即可,Python即不会报异常错误,也能正确取得任意编码的字符串,但需要注意取出后需要进行编码(decode("gbk"))才能正确显示.
另外type_checkers.py中CheckValue()中对str的判断也需要去掉,encoder.py中带'utf-8'的全改了,才能正常编码.
至于如此改会不会有其它潜在的问题,还有待测试. 参考技术A 改设置,把语言改成GBK
eclipse中java代码里出现中文乱码问题
以上是关于protobuffer java中文乱码怎么解决的主要内容,如果未能解决你的问题,请参考以下文章