如何读取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' 

a1a2是等价的但不相等:

 >>> 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。 问题是有几种方法来组成相同的字符。 一个简单的例子是重音的罗马字符。 虽然基本上所有常用的重音字符都有编码点,但从无重音的基本字母和非间距重音组合它们也是正确的。 这个问题在许多非罗马字母中更为重要。