在gspread包装器中使用unicode函数时出错。可能和bug

时间:2014-07-30 17:54:01

标签: python unicode gspread

当使用带有以下字符串的unicode函数时,它会出错:

unicode('All but Buitoni are using Pinterest buffers and Pratt & Lamber haven’t used it for a month so I’ll check on this.')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 68: ordinal not in range(128)

当我检查位置68时,它似乎是叛逆者'

>>> str='All but Buitoni are using Pinterest buffers and Pratt & Lamber haven’t used it for a month so I’ll check on this.'
>>> str[62:75]
' haven\xe2\x80\x99t us'

有没有办法解决这个问题。我在第426行的models.py文件中的gspread包装器中发现了这个错误。这是一行:

425 cell_elem = feed.find(_ns1('cell'))
426 cell_elem.set('inputValue', unicode(val))
427 uri = self._get_link('edit', feed).get('href')

因此,一旦我尝试使用值更新一个单元格,在这种情况下使用字符串,gspread包装器会尝试将其转换为unicode,但由于使用了瑕疵而无法执行此操作。可能,这是一个错误。如何处理这个问题?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

无需替换角色。只需将编码的字符串正确解码为unicode:

>>> s = 'All but Buitoni are using Pinterest buffers and Pratt & Lamber haven’t used it for a month so I’ll check on this.'
>>> s.decode('utf-8')
u'All but Buitoni are using Pinterest buffers and Pratt & Lamber haven\u2019t used it for a month so I\u2019ll check on this.'  # unicode object

你需要告诉python你的str对象使用什么编码才能将其转换为unicode,而不是直接使用unicode(some_str)。在这种情况下,您的字符串使用UTF-8进行编码。使用此方法将比尝试替换字符更好地扩展,因为对于DB中存在的每个unicode字符,您不需要特殊情况。

IMO,在Python中处理unicode的最佳做法是:

  1. 尽早将字符串解码为来自外部源(如数据库)的unicode。
  2. 在内部将它们用作unicode个对象。
  3. 只有在需要将它们发送到外部位置(文件,数据库,套接字等)时才将它们编码回字节字符串。
  4. 我还建议您查看this slide deck,它可以很好地概述如何在Python中处理unicode。