簡體   English   中英

如何在Python中讀取Unicode輸入並比較Unicode字符串?

[英]How to read Unicode input and compare Unicode strings in Python?

我使用Python工作,並希望以Unicode格式讀取用戶輸入(來自命令行),即與raw_input相當的Unicode?

另外,我想測試Unicode字符串是否相等,看起來像標准==不起作用。

raw_input()返回由OS或UI工具編碼的字符串。 困難在於知道哪個是解碼。 您可以嘗試以下操作:

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返回一個字節字符串,您必須使用正確的編碼對其進行解碼以獲取您的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字符串:你能發布一個比較不起作用的例子嗎?

我不太確定,你用“Unicode格式”表示哪種格式,有幾種。 UTF-8? UTF-16? 在任何情況下,您都應該能夠使用raw_input讀取普通字符串,然后使用字符串decode方法對其進行decode

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

如果您有不同的輸入編碼,只需使用“utf-16”或其他代替“utf-8”。 另請參閱編解碼器模塊文檔以了解不同類型的編碼。

然后比較應該與==一起正常工作。 如果您有包含特殊字符的字符串文字,則應在其前面添加“u”以將其標記為unicode:

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

如果您想再次輸出這些字符串,您可能希望以所需的編碼再次對它們進行編碼:

print decoded.encode("utf-8")

在一般情況下,可能無法比較unicode字符串。 問題是有幾種方法可以組成相同的字符。 一個簡單的例子是重音羅馬字符。 盡管基本上所有常用的重音字符都有代碼點,但從非重音基本字母和非間距重音組成它們也是正確的。 這個問題在許多非羅馬字母表中更為重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM