0

次の文字列で 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'

この問題に対処する方法はありますか。このバグは、ファイル models.py の gspread ラッパーの 426 行目に見つかりました。次の行があります。

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 に変換しようとしますが、アポストロフィのために変換できません。バグである可能性があります。この問題に対処するには?助けてくれてありがとう。

4

1 に答える 1

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

str直接使用するのではなく、オブジェクトをユニコードに変換するために、オブジェクトが使用しているエンコーディングをpythonに伝える必要がありますunicode(some_str)。この場合、文字列は でエンコードされUTF-8ます。このアプローチを使用すると、DB に存在するすべての Unicode 文字に特別なケースが必要ないため、文字を置き換えようとするよりも適切にスケーリングされます。

IMO、Python でユニコードを処理するためのベスト プラクティスは次のとおりです。

  1. 外部ソース (DB など) からできるだけ早く文字列を Unicode にデコードします。
  2. unicode内部でオブジェクトとして使用します。
  3. 外部の場所 (ファイル、DB、ソケットなど) に送信する必要がある場合にのみ、それらをバイト文字列にエンコードします。

また、Python でユニコードを処理する方法の概要を説明しているこのスライド デッキを確認することをお勧めします。

于 2014-07-30T18:58:01.037 に答える