我正在写一个程序,要求用户输入包含口音的内容。测试用户输入字符串是否与程序中声明的字符串匹配。如下所示,我的代码不起作用:
# -*- coding: utf-8 -*-
testList = ['má']
myInput = raw_input('enter something here: ')
print myInput, repr(myInput)
print testList[0], repr(testList[0])
print myInput in testList
enter something here: má
m√° 'm\xe2\x88\x9a\xc2\xb0'
má 'm\xc3\xa1'
False
enter something here: má
má u'm\xe1'
má 'm\xc3\xa1'
Warning (from warnings module):
File "/Users/ryanculkin/Desktop/delete.py", line 8
print myInput in testList
UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
比较两个字符串时,如何使代码打印为True?
另外,我注意到在同一个输入上运行这段代码的结果是不同的,这取决于我使用的是eclipse还是IDLE。这是为什么?我的最终目标是把我的程序放到网络上;有什么我需要注意的,因为结果似乎是如此不稳定?
其中一个选项是去掉字符重音,就像在::What is the best way to remove accents in a python unicode string?中所做的那样,在阅读了other locations之后,我发现可以在
#!/usr/bin/python
之后设置# -*- coding: utf-8 -*-
选项,以使所有字符串保持unicode格式,这可能会有所帮助。在这种情况下,您可能需要运行s = raw_input().decode('utf8')
来获得正确的unicode。你遇到的是
raw_input
给你一个字节字符串,但是你要比较的字符串是一个Unicode字符串。Python2试图将它们转换为要比较的公共类型,但这失败了,因为它无法猜测字节字符串的编码-因此,您的解决方案是显式地进行转换。通常,您应该将程序中的所有字符串都保持为unicode字符串(任何以字节形式读入的字符串都直接转换为unicode字符串);如果程序中有任何作为文本的字符串,则应将其设置为unicode文本,除非出于某种原因显式需要将其设置为bytestring。这会导致unicode sandwich,这通常会让你的生活更轻松。
对于文本,您可以将字符串声明为
u'má'
,或者:在脚本顶部附近生成
'un-prefixed strings'
unicode。你犯的错误意味着你已经做了这一点。要读入unicode字符串,您需要认识到
raw_input
给了您一个bytestring-so,您需要使用它的.decode
方法来转换它。您需要传递STDIN的编码,它可以作为.decode
(不要仅仅假设这是UTF8,它通常是UTF8,但并不总是这样)所以,整行将是:但是到目前为止,最简单的方法是升级到Python 3,如果可以的话,
input()
(其行为类似于Py2raw_input
否则)会给您一个unicode字符串(它会为您调用.decode
,所以您不必记住它),默认情况下,未固定的字符串是unicode字符串。所有这些都使得处理重音字符变得更加容易——它本质上意味着你尝试的逻辑在Py3中只会工作,因为它做了正确的事情。但是,请注意,您看到的错误仍然会在Py3中显示出来—但是由于它在默认情况下做了正确的事情,您必须努力才能遇到它。但是如果这样做了,那么比较将是错误的,没有任何警告-Py3永远不会尝试在字节和unicode字符串之间隐式转换,因此任何字节字符串将始终与任何unicode字符串进行不相等的比较,并且尝试对它们进行排序将引发异常。
只需注意,您与IDLE和PyDev有区别,因为PyDev会将pythonionecoding设置为启动配置中的编码>;common>;编码。还将使用该编码执行sys.setdefaultencoding(它有一个自定义的sitecustomize.py)。
相关问题 更多 >
编程相关推荐