私はPython 2.7.11を使用しています。Pythonはどのようにしてユニコードと非ユニコードタプルを等しく扱うことができますか?
私は2組持っている:
>>> t1 = (u'aaa', u'bbb')
>>> t2 = ('aaa', 'bbb')
をそして私はこれを試してみました:
>>> t1==t2
True
同じ御馳走のユニコードと非ユニコードのPythonの可能性がどのように?
私はPython 2.7.11を使用しています。Pythonはどのようにしてユニコードと非ユニコードタプルを等しく扱うことができますか?
私は2組持っている:
>>> t1 = (u'aaa', u'bbb')
>>> t2 = ('aaa', 'bbb')
をそして私はこれを試してみました:
>>> t1==t2
True
同じ御馳走のユニコードと非ユニコードのPythonの可能性がどのように?
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オブジェクトを明示的にエンコードするかのどちらかが必要です。
詳細な説明をありがとうございました。 – smwikipedia