![](/img/trans.png)
[英]How can I compare unicode type with str type in python of Chinese?
[英]How can I compare a unicode type to a string in python?
我正在嘗試使用列表理解來比較字符串對象,但是字符串之一是utf-8,即json.loads的副產品。 場景:
us = u'MyString' # is the utf-8 string
我的問題的第一部分,為什么這會返回False? :
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 Python 2.7的Google App Engine
這是問題的更完整示例:
#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()
:
data = json.loads(response)
myList = [item for item in data if item == "number1"]
您可能要使用u"number1"
以避免Unicode和字節字符串之間的隱式轉換:
data = json.loads(response)
myList = [item for item in data if item == u"number1"]
兩種版本都可以正常工作 :
>>> import json
>>> data = json.loads('{"number1":"first", "number2":"second"}')
>>> [item for item in data if item == "number1"]
[u'number1']
>>> [item for item in data if item == u"number1"]
[u'number1']
請注意,在您的第一個示例中, us
不是 UTF-8字符串。 它是unicode數據, json
庫已經為您解碼了。 另一方面,UTF-8字符串是序列編碼的bytes 。 您可能需要閱讀Unicode和Python來了解不同之處:
每個軟件開發人員絕對,肯定必須絕對了解Unicode和字符集(無借口!)作者:Joel Spolsky
Ned Batchelder的實用Unicode
在Python 2上,您期望測試返回True
期望是正確的,但您做錯了其他事情:
>>> us = u'MyString'
>>> us
u'MyString'
>>> type(us)
<type 'unicode'>
>>> us.encode('utf8') == 'MyString'
True
>>> type(us.encode('utf8'))
<type 'str'>
沒有必要將字符串編碼成UTF-8進行比較; 改用unicode文字:
myComp = [elem for elem in json_data if elem == u"MyString"]
您正在嘗試將字節字符串( 'MyString'
)與Unicode代碼點字符串( u'MyString'
)比較。 這是“蘋果和橘子”的比較。 不幸的是,Python 2在某些情況下假裝此比較有效,而不是始終返回False
:
>>> u'MyString' == 'MyString' # in my opinion should be False
True
作為設計者/開發人員,由您決定應該進行正確的比較。 這是一種可能的方法:
a = u'MyString'
b = 'MyString'
a.encode('UTF-8') == b # True
我建議使用上面的而不是a == b.decode('UTF-8')
因為所有u''
樣式字符串都可以使用UTF-8編碼為字節,除非在某些奇怪的情況下,但是並非所有字節字符串都可以以這種方式被解碼為Unicode。
但是,如果您選擇在比較之前對Unicode字符串進行UTF-8編碼,則在Windows系統上將無法執行以下操作: u'Em dashes\—are cool'.encode('UTF-8') == 'Em dashes\\x97are cool'
。 但是,如果您使用.encode('Windows-1252')
,它將成功。 這就是為什么這是蘋果和橘子的比較。
我假設您正在使用us.encode('utf-8') == "MyString"
返回False
因為str.encode()
函數返回的是字節對象 :
In [2]: us.encode('utf-8')
Out[2]: b'MyString'
在Python 3中,字符串已經是Unicode了 ,所以u'MyString'
是多余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.