python raw_输入带有包含字符串的重音的奇怪行为

2024-06-28 18:55:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个程序,要求用户输入包含口音的内容。测试用户输入字符串是否与程序中声明的字符串匹配。如下所示,我的代码不起作用:


代码

# -*- 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

使用pydev在eclipse中输出

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。这是为什么?我的最终目标是把我的程序放到网络上;有什么我需要注意的,因为结果似乎是如此不稳定?


Tags: 字符串代码用户in程序heresomethingprint
3条回答

其中一个选项是去掉字符重音,就像在::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á',或者:

from __future__ import unicode_literals

在脚本顶部附近生成'un-prefixed strings'unicode。你犯的错误意味着你已经做了这一点。

要读入unicode字符串,您需要认识到raw_input给了您一个bytestring-so,您需要使用它的.decode方法来转换它。您需要传递STDIN的编码,它可以作为.decode(不要仅仅假设这是UTF8,它通常是UTF8,但并不总是这样)所以,整行将是:

string = raw_input(...).decode(sys.stdin.encoding) 

但是到目前为止,最简单的方法是升级到Python 3,如果可以的话,input()(其行为类似于Py2raw_input否则)会给您一个unicode字符串(它会为您调用.decode,所以您不必记住它),默认情况下,未固定的字符串是unicode字符串。所有这些都使得处理重音字符变得更加容易——它本质上意味着你尝试的逻辑在Py3中只会工作,因为它做了正确的事情。

但是,请注意,您看到的错误仍然会在Py3中显示出来—但是由于它在默认情况下做了正确的事情,您必须努力才能遇到它。但是如果这样做了,那么比较将是错误的,没有任何警告-Py3永远不会尝试在字节和unicode字符串之间隐式转换,因此任何字节字符串将始终与任何unicode字符串进行不相等的比较,并且尝试对它们进行排序将引发异常。

只需注意,您与IDLE和PyDev有区别,因为PyDev会将pythonionecoding设置为启动配置中的编码>;common>;编码。还将使用该编码执行sys.setdefaultencoding(它有一个自定义的sitecustomize.py)。

相关问题 更多 >