你遇到的是raw_input
给你一个字节字符串,但你要比较的字符串是一个 Unicode 字符串。 Python 2 尝试将它们转换为通用类型进行比较,但这失败了,因为它无法猜测字节字符串的编码 - 因此,您的解决方案是显式进行转换。
通常,您应该将程序中的所有字符串作为 unicode 字符串浮动 - 您以字节形式读入的任何内容都会立即转换为 unicode;程序中作为文字的任何内容,请将其设为 unicode 文字,除非由于某种原因明确需要为字节串。这导致统一码三明治 http://nedbatchelder.com/text/unipain/unipain.html#35,这通常会让您的生活更轻松。
对于文字,您要么想要将字符串声明为u'má'
,或者有:
from __future__ import unicode_literals
靠近脚本顶部的位置'un-prefixed strings'
统一码。您收到的错误意味着您已经完成了这一点。
要读取 unicode 字符串,您需要意识到raw_input
给你一个字节串 - 所以,你需要使用它的转换它.decode
方法。你需要通过.decode
STDIN 的编码 - 可以作为sys.stdin.encoding
(不要只是假设这是 UTF8 - 它经常会,但并非总是如此) - 所以,整行将是:
string = raw_input(...).decode(sys.stdin.encoding)
但到目前为止,解决这个问题最简单的方法是升级到 Python 3(如果可以的话)——在那里,input()
(其行为类似于 Py2raw_input
否则)给你一个unicode字符串(它调用.decode
对于你来说,你不必记住它),并且默认情况下,无前缀的字符串是 unicode 字符串。这一切都使得使用重音字符变得更加容易 - 它本质上意味着您尝试的逻辑将只是工作在 Py3 中,因为它做了正确的事情。
但请注意,您看到的错误仍然会在 Py3 中出现 - 但由于它默认执行正确的操作,因此您必须努力工作才能遇到它。但如果你这样做,比较将只是 False,没有警告 - Py3 不会尝试在字节和 unicode 字符串之间隐式转换,因此任何字节字符串总是与任何 unicode 字符串比较不相等,并且尝试对它们进行排序将抛出异常。