Python UTF-8比较

2024-09-27 21:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

里面是怎么回事?

对不起,这是我的错。这仍然是错误的。我在Ubuntu 10.04上使用Python 2.6。


Tags: falseubuntu错误utfdecodexa7xc3xb6
3条回答

可能的解决方案

或者这样写:

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']

解释

根据蒂姆的评论更新。在原始代码中,b.decode('utf-8') == u'çö'a['a'] == 'çö',因此您实际上进行了以下比较:

u'çö' == 'çö'

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

但是,在u'çö' == 'çö'的情况下失败,因为unicode('çö')返回以下错误:Unicode decode error:“ascii”编解码器无法解码位置0中的字节0xc3:序号不在范围(128)内,因此整个比较返回False并发出以下警告:Unicode warning:Unicode equal comparison未能同时转换这两个Unicode的参数-将它们解释为不等的

b是一个stringa是一个dict

你想要(我相信):

b == a['a']

UTF-8是一种用于在文件中记录Unicode文本的编码。但是,在Python中,您使用的对象具有表示Unicode文本的固定方式,而这种方式不是UTF-8。

您仍然可以在Python中比较Unicode字符串,但这与UTF-8无关,只是如果要将常量放入这些Unicode字符串中,则需要用UTF-8编码包含源代码的文件的文本。一旦执行赋值运算符,字符串就不再是UTF-8,而是Python的内部表示。

顺便说一下,如果您正在与Unicode进行比较,那么您可能希望在进行比较之前使用unicodedata模块并规范化字符串。

相关问题 更多 >

    热门问题