簡體   English   中英

如何比較unicode類型和python中的字符串?

[英]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來了解不同之處:

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM