2013-01-14 57 views
2

我花了大約四個小時研究「UnicodeWarning:Unicode不等比較」問題。通常,在幾個小時之後,我能夠自己回答我最棘手的問題,但這不是這種情況。當然,我的意思是「棘手」。 ;-)如何解決UnicodeWarning問題?

我知道類似的問題可以在網上回答,也可以在本網站上得到解答,但如果太過於理解答案,我根本無法解決問題。也許我得到它的最好方法是讓別人指出我的代碼中需要更改什麼。

我在Windows XP上使用Python 2.5。

我能想出

我明白我的問題與我試圖比較蘋果和橘子(或Unicode和ASCII,或類似的東西,如可能字節)做什麼。我不知道的是解決這個問題的實際方法。

這裏是我的代碼:

# coding: iso-8859-1 
import sys 
from easygui import * 

actual_answer = "pureté" 
answer_given = enterbox("Type your answer!\n\nHint: 'pureté'") 

if answer_given == actual_answer: 
    msgbox("Correct! The answer is 'pureté'") 
else: 
    msgbox("Bug!") 

以下是錯誤消息我得到:

UnicodeWarning:統一等於比較失敗既 參數轉換爲Unicode - 將它們解釋因爲不相等

+0

如果它在Python 3中變量中的字符串已經是unicode,並且沒有庫會返回bytestring。這是Python 2. – jsbueno

+0

無論哪種方式OP明確指出,他在Windows XP上的Python 2.5 ...... – Dayan

回答

1

首先閱讀:http://www.joelonsoftware.com/articles/Unicode.html

然後 - 在任何系統中處理Python時都不應該使用iso-8859-1編碼 - 請使用utf-8來代替。

第三,您的easygui組件正在返回一個unicode對象而不是字節串。固定在上面的代碼最簡單的方法是使actual_answer變量一個Unicode的對象,但前綴一個「U」,以引號,像:

actual_answer = u"pureté" 
+0

非常感謝。我閱讀這篇文章,得出的明顯結論是UTF-8是我需要的。所以我做了你的建議和我的程序現在的作品。 – user1975126

+0

如果將答案存儲在數組中,該怎麼辦?例如:「actual_answer = answer_list [random_choice] [1]」?我如何將其轉換爲Unicode? – user1975126

0

這裏有一個函數返回正確utf-8格式:

def utf8(str): 
     return unicode(str, 'latin1').encode('utf-8') 

另外,你有沒有嘗試過使用unicode轉義?

print "puret\u00E9".decode("unicode_escape") 

例如,您可以應用此對您的代碼像這樣:

# coding: iso-8859-1 
import sys 
from easygui import * 

actual_answer = "puret\u00E9".decode("unicode_escape") 
answer_given = enterbox("Type your answer!\n\nHint: " + actual_answer) 

if answer_given == actual_answer: 
    msgbox("Correct! The answer is " + actual_answer) 
else: 
    msgbox("Bug!") 

參考Python文檔有關Unicode逃逸更詳細的信息。 http://docs.python.org/2/howto/unicode.html