2016-04-12 15 views

答えて

6

Python 2は、バイトコードとユニコードを等しいとみなします。ところで、これはタプルを含むものとは関係ありません。代わりに暗黙的な型変換を行う必要があります。これについては以下で説明します。

それはとても本当にフードの下に行くかを見るために、私たちは高いコードポイントを使用することによって、障害を引き起こすことができ、「簡単に」ASCIIコードポイントでそれを証明するのは難しい:

>>> bites = u'Ç'.encode('utf-8') 
>>> unikode = u'Ç' 
>>> print bites 
Ç 
>>> print unikode 
Ç 
>>> bites == unikode 
/Users/wim/Library/Python/2.7/bin/ipython:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
    #!/usr/bin/python 
False 

Unicodeとバイトを見にPythonは、バイトがsys.getdefaultencoding()(私のプラットフォームでは 'ascii')でエンコードされていると仮定することによって、バイトコードをUnicodeオブジェクトにデコードすることを暗黙的に試みました。

上記の例では、バイトが 'utf-8'でエンコードされているため、これは失敗しました。さて、それは「仕事」してみましょう:

>>> bites = u'Ç'.encode('ISO8859-1') 
>>> unikode = u'Ç' 
>>> import sys 
>>> reload(sys) # please don't ever actually use this hack, guys 
<module 'sys' (built-in)> 
>>> sys.setdefaultencoding('ISO8859-1') 
>>> bites == unikode 
True 

あなたのアップコンバージョンはかなり同じように「作品」が、「アスキー」コーデックを使用しました。この種の暗黙的なバイトとユニコードの変換は実際にはかなり悪いものであり、多くはpainを引き起こす可能性があるため、Python 3では "明示的な方が暗黙的に優れている"ため、これらの処理をやめることになりました。

Python 3+では、あなたのコードは実際には両方ともUnicode文字列リテラルを表しているので、それらは等しくなります。 u接頭辞は暗黙のうちに無視されます。 Python3でバイトリテラルを使用する場合は、b'this'のように指定する必要があります。次に、1)明示的にバイトをデコードするか、2)比較を行う前にUnicodeオブジェクトを明示的にエンコードするかのどちらかが必要です。

+2

詳細な説明をありがとうございました。 – smwikipedia

関連する問題