簡體   English   中英

python 如何將 unicode 和非 unicode 元組視為平等?

[英]How could python treat unicode and non-unicode tuple as equal?

我正在使用 Python 2.7.11。

我有 2 個元組:

>>> t1 = (u'aaa', u'bbb')
>>> t2 = ('aaa', 'bbb')

我試過這個:

>>> t1==t2
True

Python 如何將 unicode 和非 unicode 一視同仁?

Python 2 認為字節串和 unicode 相等。 順便說一句,這與包含元組無關。 相反,它與隱式類型轉換有關,我將在下面解釋。

很難用“簡單”的 ascii 代碼點來演示它,所以為了看看幕后真正發生了什么,我們可以通過使用更高的代碼點來引發失敗:

>>> bites = u'Ç'.encode('utf-8')
>>> unikode = u'Ç'
>>> print bites
Ç
>>> print unikode
Ç
>>> bites == unikode
/Users/wim/Library/Python/2.7/bin/ipython:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  #!/usr/bin/python
False

在看到上面的 unicode 和字節比較時,python 通過假設字節是用sys.getdefaultencoding() (在我的平台上是“ascii” sys.getdefaultencoding()來隱式地嘗試將字節sys.getdefaultencoding()解碼為 un​​icode 對象。

在我上面剛剛展示的情況下,這失敗了,因為字節是用“utf-8”編碼的。 現在,讓我們讓它“工作”:

>>> bites = u'Ç'.encode('ISO8859-1')
>>> unikode = u'Ç'
>>> import sys
>>> reload(sys)   # please don't ever actually use this hack, guys 
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('ISO8859-1')
>>> bites == unikode
True

您的上轉換以幾乎相同的方式“工作”,但使用“ascii”編解碼器。 字節和 unicode 之間的這種隱式轉換實際上非常邪惡,會引起很多痛苦,因此決定停止在 Python 3 中執行這些操作,因為“顯式優於隱式”。

作為一個小題外話,在 Python 3+ 上,您的代碼實際上都表示 unicode 字符串文字,因此無論如何它們都是相等的。 u 前綴被默默忽略。 如果你想在 python3 中使用字節b'this'文字,你需要像b'this'一樣指定它。 然后,您可能需要 1) 顯式解碼字節,或 2) 在進行比較之前顯式編碼 unicode 對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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