19
a = {"a":"çö"}
b = "çö"
a['a']
>>> '\xc3\xa7\xc3\xb6'

b.decode('utf-8') == a['a']
>>> False

そこには何が入っていますか?

edit=すみません、私のミスでした。それはまだ偽です。Ubuntu 10.04 で Python 2.6 を使用しています。

4

7 に答える 7

30

可能な解決策

次のように記述します。

a = {"a": u"çö"}
b = "çö"
b.decode('utf-8') == a['a']

.decode('utf-8')または、次のように (両側の をスキップすることもできます):

a = {"a": "çö"}
b = "çö"
b.decode('utf-8') == a['a'].decode('utf-8')

またはこのように(私の推奨):

a = {"a": u"çö"}
b = u"çö"
b == a['a']

説明

Tim のコメントに基づいて更新されました。 元のコードでは、b.decode('utf-8') == u'çö'a['a'] == 'çö'、実際には次の比較を行っています。

u'çö' == 'çö'

オブジェクトの 1 つは 型unicodeで、もう 1 つは 型strであるため、比較を実行するために を にstr変換してからunicode、2 つのunicodeオブジェクトを比較します。純粋な ASCII 文字列の場合は問題なく動作します。たとえばu'a' == 'a'unicode('a') == u'a'です。

ただし、 の場合は失敗します。次のエラーが返されるためです: u'çö' == 'çö'UnicodeDecodeError : 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)。したがって、比較全体で False が返され、次の警告が発行されます。 : UnicodeWarning: Unicode の等しい比較で、両方の引数を Unicode に変換できませんでした - それらが等しくないと解釈しています。unicode('çö')

于 2010-08-03T20:00:16.297 に答える
5

bstringaですdict

あなたが望む(私は信じています):

b == a['a']

于 2010-08-03T19:41:49.183 に答える
4

UTF-8 は、Unicode テキストをファイルに記録するために使用されるエンコーディングです。ただし、Python では、Unicode テキストを表現する固定の方法を持つオブジェクトを操作しており、その方法は UTF-8 ではありません。

Python で Unicode 文字列を比較することはできますが、これは UTF-8 とは無関係です。ただし、これらの Unicode 文字列に定数を入れたい場合は、ソース コードを含むファイルのテキストを UTF-8 でエンコードする必要があります。 8. 代入演算子が実行されるとすぐに、文字列は UTF-8 ではなくなり、Python の内部表現になります。

ところで、Unicode で比較を行う場合は、おそらく unicodedata モジュールを使用して、比較を行う前に文字列を正規化することをお勧めします。

于 2010-08-03T20:48:55.973 に答える
2

b == a['a'] を試してください

于 2010-08-03T19:42:00.043 に答える
2

文字列を辞書と比較しています。

>>> a = {"a":"çö"}
>>> b = "çö"
>>> a == b
False
>>> a['a'] == b
True

文字列 (b) を a (a['a']) のメンバーと比較すると、目的の結果が得られます。

于 2010-08-03T19:42:23.303 に答える
0

コードが UTF-8 (Latin-1 ではない) であることを確認するか、次のようなコーディング行を使用してください。

#! /usr/bin/python
# -*- coding: utf-8 -*-
a = {"a": u"çö"}
b = "çö"
assert b == a['a']
assert b.decode('utf-8') == a['a'].decode('utf-8')

全面的にユニコードを使用している場合は、将来から unicode_literals をインポートして、エンコーディングの苦労を減らすことができます。

#! /usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
a = {"a": u"çö"}
b = "çö"
assert b == a['a']
assert b == a['a']
assert b.encode('utf-8') != a['a']
assert b.encode('utf-8') == a['a'].encode('utf-8')

ファイルが unicode_literals を使用している場合、すべての「文字列」は (ファイルのコーディングに従って) u「unicode」オブジェクトになります (Python 3.X で文字列/バイト分割をエミュレートするため) ab を「先頭に追加」していない場合) .

于 2010-08-03T20:51:39.563 に答える
0

NullUserException は、これが正しいはずです。

b == a['a']

片面を utf-8 としてデコードしている (Unicode 文字列を作成している) 一方で、もう一方の面は utf-8 でエンコードされたバイト文字列のままであるため、まだ「False」になっています。

于 2010-08-04T19:12:17.963 に答える