protobuf支持非UTF8字符串

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'的全改了,才能正常编码.


至于如此改会不会有其它潜在的问题,还有待测试.


你可能感兴趣的:(程序开发)