如何阅读Unicode输入和Python中比较Unicode字符串?

问题描述 投票:30回答:4

我在Python工作,并想读Unicode格式的用户输入(来自命令行),即一个Unicode等效raw_input的?

另外,我想测试平等的Unicode字符串,它看起来像一个标准的==不起作用。

python unicode
4个回答
54
投票

由操作系统或UI设施编码raw_input()返回一个字符串。困难的是知道哪些是解码。您可能会尝试以下操作:

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

如果你给我们更多的信息,我们也许能帮助你更多,但。


16
投票

它应该工作。 raw_input返回一个字节的字符串,你必须使用解码正确的编码,让您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
日本語 Ελληνικά

至于比较Unicode字符串:你可以发布一个例子比较不起作用?


4
投票

我真的不知道,你说的“Unicode格式”是指哪一种格式,有以下几种。 UTF-8? UTF-16?在任何情况下,你应该能够读取一个正常的字符串raw_input,然后使用decode方法字符串解码它:

raw = raw_input("Please input some funny characters: ")
decoded = raw.decode("utf-8")

如果你有一个不同的输入编码只使用“UTF-16”或什么,而不是“UTF-8”。另请参阅the codecs modules docs为不同种类的编码。

然后比较应该只是与==罚款。如果你有一个包含你应该前缀他们的特殊字符的字符串文字的“u”,以纪念他们为Unicode:

if decoded == u"äöü":
  print "Do you speak German?"

如果你想再次输出这些字符串,你可能想在所需的编码再编码它们:

print decoded.encode("utf-8")

1
投票

在一般情况下,它可能不是能够比较Unicode字符串。问题是,有几种方法来撰写相同的字符。一个简单的例子是重音罗马字符。虽然有基本上所有常用的重音字符的代码点,这也是正确的从重音基本字母和非间距口音撰写他们。这个问题在许多非罗马字母更显著。

© www.soinside.com 2019 - 2024. All rights reserved.