2013-01-14 50 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