在Python中使用protobuf2.6.1 string format utf-8 and unicode error

版本信息:

protobuf: v2.6.1

python: 2.7

关于在Python中使用protobuf时 string格式字段的编码问题

在python中编码格式多采用utf-8格式。而protobuf

官网中这样说到:

如果不做处理,在message 中定义了一个string类型的字段后,出现错误如下:

ERROR:

ValueError: ‘\xe5\x94\x90\xe6\x9e\x9c‘ has type bytes, but isn‘t in 7-bit ASCII encoding. Non-ASCII strings must be converted to unicode objects before being added.

解决办法有两种。如下:

1) 一劳永逸的方法-修改源码

  a. 文件../google/protobuf/internal/decoder.py

def StringDecoder(field_number, is_repeated, is_packed, key, new_default):
  """Returns a decoder for a string field."""

  local_DecodeVarint = _DecodeVarint
  local_unicode = unicode

  def _ConvertToUnicode(byte_str):
    try:
      #return local_unicode(byte_str, ‘utf-8‘) # 注释掉 不转码
      return byte_str
    except UnicodeDecodeError, e:
      # add more information to the error message and re-raise it.
      e.reason = ‘%s in field: %s‘ % (e, key.full_name)
      raise

b. 文件../google/protobuf/internal/type_checkers.py

class UnicodeValueChecker(object):

  """Checker used for string fields.

  Always returns a unicode value, even if the input is of type str.
  """

  def CheckValue(self, proposed_value):
    if not isinstance(proposed_value, (bytes, unicode)):
      message = (‘%.1024r has type %s, but expected one of: %s‘ %
                 (proposed_value, type(proposed_value), (bytes, unicode)))
      raise TypeError(message)

    # If the value is of type ‘bytes‘ make sure that it is in 7-bit ASCII
    # encoding.
#    if isinstance(proposed_value, bytes):
#      try:
#        proposed_value = proposed_value.decode(‘ascii‘)
#      except UnicodeDecodeError:
#        raise ValueError(‘%.1024r has type bytes, but isn\‘t in 7-bit ASCII ‘
#                         ‘encoding. Non-ASCII strings must be converted to ‘
#                         ‘unicode objects before being added.‘ %
#                         (proposed_value))
    return proposed_value

2) 很烦的方法-手动转码

  在message中赋值时 都带上 decode("utf-8")

时间: 2024-12-25 12:14:22

在Python中使用protobuf2.6.1 string format utf-8 and unicode error的相关文章

python中date、datetime、string的相互转换

import datetime import time string转datetime str = '2012-11-19' date_time = datetime.datetime.strptime(str,'%Y-%m-%d') date_time datetime.datetime(2012,11,19,0,0) datetime转string date_time.strftime('%Y-%m-%d') '2012-11-19' datetime转时间戳 time_time = tim

string.format、string.connect和+=运算 效率计算

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StringFormatEfficiency { class Program { static void Main(string[] args) { string format = "my {0} is {1}"; string name = "name"; string zh

C# string.Format谨慎使用

string.Format string.Format在处理文本的时候很有用处,但是在使用占位符的时候一定要注意内容中的特殊字符{}. 示例 string.Format("你好{0},这是{1}",name,adress);//这样肯定是没有问题的. string shijian="现在是:{"+DateTime.Now.toString()+"}"; string.Format("你好{0},这是{1}"+shijian,n

python中string.casefold和string.lower区别

string.casefold和string.lower 区别 python 3.3 引入了string.casefold 方法,其效果和 string.lower 非常类似,都可以把字符串变成小写,那么它们之间有什么区别?他们各自的应用场景? 对 Unicode 的时候用 casefold string.casefold官方说明: Casefolding is similar to lowercasing but more aggressive because it is intended t

python中string模块各属性以及函数的用法

任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求: python的字符串属性函数 python的string模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 字符串属性函数 系统版本:CentOS release 6.2 (Final)2.6.32

什么是string interning(字符串驻留)以及python中字符串的intern机制

Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when

乱码问题引申 python 中string和unicode

HtmlTestRunner的乱码问题 1生成的报告中,对print打印的数据都记录下来,但是数据有些会存在乱码.如下面.有些又没有乱码. 这到底是怎么回事呢? str=t.encode('utf-8') print str 第一个test我以utf-8编码,看来htmlTestRunner不是utf-8 编码. 为何第二个正确了呢? 第二个是unicode编码方式. 也就是说,可以被其他任何encode了. 原码中已这个进行编码,也就是说他设置为latin-1这种编码方式了.估计是作者自己国家

python中string格式化

python中可以对string, int, float等数据类型进行格式化操作.下面举例来说明一些常用操作. 先贴出 python 对 String Formatting Operations 讲解的连接,后面的例子和内容都以它为参考. - flags '#' : '0' : 用'0'进行填充 '-'  : 左对齐 ' '  : 对于数字来说,整数前面会有个空格,负数不收到影响 '+' : 对数字添加正负号 - conversion list In[101]: print '%30.4fabc

python中的string

也可以用一个变量来保存字符串,然后输出str = ‘bad’print str 如果你想表示一段带有英文单引号或者双引号的文字,那么表示这个字符串的引号就要与内容区别开. 内容带有单引号,就用双引号表示"It's good" 反之亦然 ‘You are a "BAD" man’  //即字符串里面是双引号,外面必须为单引号. python中还有一种表示字符串的方法:三个引号(‘’‘)或者(""") 在三个引号中,你可以方便地使用单引号和