google protocol buffer在python中使用utf-8的問題

來源:互聯網
上載者:User
google protocol buffer好用,但是在python中會有一些小問題。比如不支援utf-8隻支援unicode的字串。在我們的系統中,儲存的和傳輸的都是utf-8,因此在代碼中(c++,java,python)都統一使用utf-8格式。所以就帶來不方便,比如c++中需要從utf-8轉為unicode,python中再解析出來。實際上,可以讓google protocol buffer for python不進行轉碼。

我遇到的問題是:c++讀取檔案(檔案時utf-8的),然後python接受,c++發送的是utf-8的,但是python卻要求unicode的,巨鬱悶。

對於string類型的描述如下,說utf-8和ascii都支援,實際上python版本的卻要求unicode,實在是可笑,由此可見,實際上試一下比說啥都強。

string A string must always contain UTF-8 encoded or 7-bit ASCII text. string String

下載google protocol buffer的源碼,如http://code.google.com/p/protobuf/downloads/list,下載2.0.3版本。
進入/protobuf-2.0.3/python/google/protobuf/internal目錄下
encode.py

  1.   def AppendString(self, field_number, value):
  2.     """Appends a length-prefixed unicode string, encoded as UTF-8 to our buffer,
  3.     with the length varint-encoded.
  4.     """
  5. #  self.AppendBytes(field_number, value.encode('utf-8'))
  6. #  將value.encode去掉,我本來就是utf-8,幹嗎還編碼呢
  7.     self.AppendBytes(field_number, value)

decode.py

  1.   def ReadString(self):
  2.     """Reads and returns a length-delimited string."""
  3.     bytes = self.ReadBytes()
  4. #    return unicode(bytes, 'utf-8')
  5. #    改為下面這句,啥也不幹,是什麼編碼就返回什麼編碼
  6.     return bytes

type_check.py

  1. class UnicodeValueChecker(object):
  2.   """Checker used for string fields."""
  3.   def CheckValue(self, proposed_value):
  4.     if not isinstance(proposed_value, (str, unicode)):
  5.       message = ('%.1024r has type %s, but expected one of: %s' %
  6.                  (proposed_value, type(proposed_value), (str, unicode)))
  7.       raise TypeError(message)
  8.     # If the value is of type 'str' make sure that it is in 7-bit ASCII
  9.     # encoding.
  10.     # 莫名其妙,為何要try convert to unicode,而且是從ascii轉,注釋掉
  11. #    if isinstance(proposed_value, str):
  12. #      try:
  13. #        unicode(proposed_value, 'ascii')
  14. #      except UnicodeDecodeError:
  15. #        raise ValueError('%.1024r isn/'t in 7-bit ASCII encoding.'
  16. #                         % (proposed_value))

改了之後,重新安裝一下,它就不會給你轉編碼了,你想傳什麼編碼就什麼編碼。我用過c++版本的,好像不會處理編碼問題。不過好像proto的資料類型中bytes也能滿足要求,bytes它是不做任何處理的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.