如何解决UnicodeWarning问题?

时间:2013-01-14 00:36:36

标签: python unicode ascii

我花了大约四个小时研究“UnicodeWarning:Unicode不等比较”问题。通常,几个小时后,我能够自己回答我最棘手的问题,但事实并非如此。当然,我的意思是“狡猾”。 ; - )

我知道类似的问题也可以在网上和网站上得到解答,但是太过于努力无法理解答案并不能帮助我。也许对我来说最好的方法就是让某人指出我的代码中需要更改的内容。

我在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等同比较无法转换两者   Unicode的参数 - 将它们解释为不相等

2 个答案:

答案 0 :(得分:1)

首先,请阅读:http://www.joelonsoftware.com/articles/Unicode.html

然后 - 在任何系统中处理Python时都不应该使用iso-8859-1编码 - 而是使用utf-8

第三,您的easygui组件返回一个unicode对象而不是字节串。在上面的代码中修复它的最简单方法是使actual_answer变量成为unicode对象,但在引号前加上“u”,如:

actual_answer = u"pureté"

答案 1 :(得分: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!")

有关Unicode Escapes的更多详细信息,请参阅Python文档。 http://docs.python.org/2/howto/unicode.html