Python UTF-8比较

erk*_*gur 18 python unicode utf-8 python-2.x

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

b.decode('utf-8') == a['a']
>>> False
Run Code Online (Sandbox Code Playgroud)

那里发生了什么?

编辑=对不起,这是我的错.它仍然是假的.我在Ubuntu 10.04上使用Python 2.6.

Bol*_*olo 29

可能的解决方案

要么像这样写:

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

或者像这样(你也可以跳过.decode('utf-8')两边):

a = {"a": "çö"}
b = "çö"
b.decode('utf-8') == a['a'].decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

或者像这样(我的推荐):

a = {"a": u"çö"}
b = u"çö"
b == a['a']
Run Code Online (Sandbox Code Playgroud)

说明

根据蒂姆的评论更新. 在你的原代码,b.decode('utf-8') == u'çö'并且a['a'] == 'çö',这样你实际上做以下对比:

u'çö' == 'çö'
Run Code Online (Sandbox Code Playgroud)

其中一个对象是类型unicode,另一个是类型str,因此为了执行比较,将str其转换为unicode然后unicode比较两个对象.它在纯ASCII字符串的情况下工作正常,例如:u'a' == 'a',因为unicode('a') == u'a'.

但是,它会失败u'çö' == 'çö',因为unicode('çö')返回以下错误:UnicodeDecodeError:'ascii'编解码器无法解码位置0中的字节0xc3:序号不在范围内(128),因此整个比较返回False并发出以下警告:UnicodeWarning:Unicode等于比较无法将两个参数都转换为Unicode - 将它们解释为不相等.


Nul*_*ion 5

b是一个string,a是一个dict

你想要(我相信):

b == a['a']