我试图使用列表理解来比较字符串对象,但是其中一个字符串是utf-8,它是json.loads的副产品。情景:
us = u'MyString' # is the utf-8 string
我的第一个问题是,为什么这个返回值是假的?以下内容:
us.encode('utf-8') == "MyString" ## False
第二部分-如何在列表理解中进行比较?
myComp = [utfString for utfString in jsonLoadsObj
if utfString.encode('utf-8') == "MyString"] #wrapped to read on S.O.
编辑:我正在使用Google App Engine,它使用Python 2.7
下面是一个更完整的问题示例:
#json coming from remote server:
#response object looks like: {"number1":"first", "number2":"second"}
data = json.loads(response)
k = data.keys()
I need something like:
myList = [item for item in k if item=="number1"]
#### I thought this would work:
myList = [item for item in k if item.encode('utf-8')=="number1"]
必须在错误的数据集上循环;只要直接在加载了JSON的字典上循环,就不需要首先调用
.keys()
:您可能需要使用
u"number1"
来避免Unicode和字节字符串之间的隐式转换:两个版本都工作正常:
注意,在第一个示例中,
us
是而不是一个UTF-8字符串;它是unicode数据,json
库已经为您解码了它。另一方面,UTF-8字符串是一个编码字节序列。您可能需要阅读Unicode和Python以了解其区别:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)作者Joel Spolsky
Python Unicode HOWTO
Pragmatic Unicode作者:Ned Batchelder
在Python 2上,您对测试返回
True
的期望是正确的,但您做了其他错误的事情:不需要将字符串编码为UTF-8进行比较;请改用unicode文本:
您正在尝试将字节字符串(
'MyString'
)与Unicode代码点字符串(u'MyString'
)进行比较。这是一个“苹果和橘子”的比较。不幸的是,Python2在某些情况下假装这种比较是有效的,而不是总是返回False
:作为设计师/开发人员,您可以决定应该进行什么样的正确比较。以下是一种可能的方法:
我建议使用上述方法而不是
a == b.decode('UTF-8')
,因为所有u''
样式的字符串都可以用UTF-8编码成字节,除非在某些奇怪的情况下,但并非所有字节字符串都可以用这种方式解码为Unicode。但是,如果您选择在比较之前对Unicode字符串进行UTF-8编码,那么在Windows系统上这样做会失败:
u'Em dashes\u2014are cool'.encode('UTF-8') == 'Em dashes\x97are cool'
。但如果你.encode('Windows-1252')
取而代之,它会成功的。这就是为什么它是苹果和橘子的比较。我假设您使用的是Python 3。
us.encode('utf-8') == "MyString"
返回False
,因为str.encode()
函数是returning a bytes object:在Python 3中,字符串是already Unicode,因此
u'MyString'
是多余的。相关问题 更多 >
编程相关推荐