2024-09-27 21:33:20 发布
网友
a = {"a":"çö"} b = "çö" a['a'] >>> '\xc3\xa7\xc3\xb6' b.decode('utf-8') == a['a'] >>> False
里面是怎么回事?
对不起,这是我的错。这仍然是错误的。我在Ubuntu 10.04上使用Python 2.6。
或者这样写:
a = {"a": u"çö"} b = "çö" b.decode('utf-8') == a['a']
或者像这样(您也可以跳过两边的.decode('utf-8')):
.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'] == 'çö',因此您实际上进行了以下比较:
b.decode('utf-8') == u'çö'
a['a'] == 'çö'
u'çö' == 'çö'
其中一个对象是类型unicode,另一个是类型str,因此为了执行比较,将str转换为unicode,然后比较两个unicode对象。它在纯ASCII字符串的情况下工作良好,例如:u'a' == 'a',因为unicode('a') == u'a'。
unicode
str
u'a' == 'a'
unicode('a') == u'a'
但是,在u'çö' == 'çö'的情况下失败,因为unicode('çö')返回以下错误:Unicode decode error:“ascii”编解码器无法解码位置0中的字节0xc3:序号不在范围(128)内,因此整个比较返回False并发出以下警告:Unicode warning:Unicode equal comparison未能同时转换这两个Unicode的参数-将它们解释为不等的。
unicode('çö')
b是一个string,a是一个dict
b
string
a
dict
你想要(我相信):
b == a['a']
UTF-8是一种用于在文件中记录Unicode文本的编码。但是,在Python中,您使用的对象具有表示Unicode文本的固定方式,而这种方式不是UTF-8。
您仍然可以在Python中比较Unicode字符串,但这与UTF-8无关,只是如果要将常量放入这些Unicode字符串中,则需要用UTF-8编码包含源代码的文件的文本。一旦执行赋值运算符,字符串就不再是UTF-8,而是Python的内部表示。
顺便说一下,如果您正在与Unicode进行比较,那么您可能希望在进行比较之前使用unicodedata模块并规范化字符串。
可能的解决方案
或者这样写:
或者像这样(您也可以跳过两边的
.decode('utf-8')
):或者像这样(我的建议):
解释
根据蒂姆的评论更新。在原始代码中,
b.decode('utf-8') == u'çö'
和a['a'] == 'çö'
,因此您实际上进行了以下比较:其中一个对象是类型
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
是一个string
,a
是一个dict
你想要(我相信):
b == a['a']
UTF-8是一种用于在文件中记录Unicode文本的编码。但是,在Python中,您使用的对象具有表示Unicode文本的固定方式,而这种方式不是UTF-8。
您仍然可以在Python中比较Unicode字符串,但这与UTF-8无关,只是如果要将常量放入这些Unicode字符串中,则需要用UTF-8编码包含源代码的文件的文本。一旦执行赋值运算符,字符串就不再是UTF-8,而是Python的内部表示。
顺便说一下,如果您正在与Unicode进行比较,那么您可能希望在进行比较之前使用unicodedata模块并规范化字符串。
相关问题 更多 >
编程相关推荐