如何读取Unicodeinput并比较Python中的Unicodestring?
我在Python中工作,并希望读取Unicode格式的用户input(从命令行),即一个Unicode相当于raw_input
?
此外,我想testingUnicodestring的平等,它看起来像一个标准==
不起作用。
感谢您的帮助 !
raw_input()
返回由操作系统或UI设施编码的string。 难点在于知道哪个是解码。 您可以尝试以下操作:
import sys, locale text= raw_input().decode(sys.stdin.encoding or locale.getpreferredencoding(True))
这在大多数情况下应该能够正常工作。
我们需要更多关于不使用Unicode比较的数据来帮助您。 但是,这可能是正常化的问题。 考虑以下几点:
>>> a1= u'\xeatre' >>> a2= u'e\u0302tre'
a1
和a2
是等价的但不相等:
>>> print a1, a2 être être >>> print a1 == a2 False
所以你可能想使用unicodedata.normalize()
方法:
>>> import unicodedata as ud >>> ud.normalize('NFC', a1) u'\xeatre' >>> ud.normalize('NFC', a2) u'\xeatre' >>> ud.normalize('NFC', a1) == ud.normalize('NFC', a2) True
如果你给我们更多的信息,我们也许可以帮助你。
它应该工作。 raw_input
返回一个字节string,您必须使用正确的编码解码才能获得您的unicode
对象。 例如,下面的代码在Python 2.5 / Terminal.app / OSX下工作:
>>> bytes = raw_input()日本語 Ελληνικά >>> bytes '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e \xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac' >>> uni = bytes.decode('utf-8') # substitute the encoding of your terminal if it's not utf-8 >>> uni u'\u65e5\u672c\u8a9e \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac' >>> print uni日本語 Ελληνικά
至于比较unicodestring:你可以发布一个比较不起作用的例子吗?
我不是很确定,你的意思是“Unicode格式”的格式,有几种。 UTF-8? UTF-16? 在任何情况下,你应该能够使用raw_input
读取一个正常的string,然后使用stringdecode
方法对其进行decode
:
raw = raw_input("Please input some funny characters: ") decoded = raw.decode("utf-8")
如果你有一个不同的input编码,只需使用“utf-16”或其他什么来代替“utf-8”。 另请参阅各种编码的编解码器模块文档 。
比较,那么应该与==
工作得很好。 如果你有string文字包含特殊字符,你应该用“u”来标记它们为unicode:
if decoded == u"äöü": print "Do you speak German?"
如果你想再次输出这些string,你可能想要再次编码他们所需的编码:
print decoded.encode("utf-8")
在一般情况下,可能无法比较unicodestring。 问题是有几种方法来组成相同的字符。 一个简单的例子是重音的罗马字符。 虽然基本上所有常用的重音字符都有编码点,但从无重音的基本字母和非间距重音组合它们也是正确的。 这个问题在许多非罗马字母中更为重要。