你說:我有我想要得到的長度字符串ëaúlt一個操縱基於字符的位置等。問題是第一個數字被計數兩次,或者我猜'ë位於第0位,'位於第1位。
處理任何Unicode問題的第一步是確切知道數據中的內容;不要猜測。在這種情況下,你的猜測是正確的。它並不總是如此。
「你的數據究竟是什麼」:使用repr()內置函數(除了unicode之外還有更多的東西)。在你的問題中顯示repr()輸出的一個有用的優點是,回答者確實擁有你所擁有的。請注意,您的文本僅以四個位置顯示,而不是一些瀏覽器/字體顯示爲五個 - 「e」及其變音符號和「a」在一個位置上被拼湊在一起。
您可以使用unicodedata.name()函數來告訴您每個組件是什麼。
下面是一個例子:
# coding: utf8
import unicodedata
x = u"ë́aúlt"
print(repr(x))
for c in x:
try:
name = unicodedata.name(c)
except:
name = "<no name>"
print "U+%04X" % ord(c), repr(c), name
結果:
u'\xeb\u0301a\xfalt'
U+00EB u'\xeb' LATIN SMALL LETTER E WITH DIAERESIS
U+0301 u'\u0301' COMBINING ACUTE ACCENT
U+0061 u'a' LATIN SMALL LETTER A
U+00FA u'\xfa' LATIN SMALL LETTER U WITH ACUTE
U+006C u'l' LATIN SMALL LETTER L
U+0074 u't' LATIN SMALL LETTER T
現在讀@ bobince的答案:-)
這是很容易在Perl做了'的Unicode :: GCString'模塊,其方法包括像'length','substr'和'index'這樣的標準東西,它們都以字符而不是代碼點或代碼單元進行操作。它甚至包含一個'columns'方法,這對於東亞寬/全字符以及結合字符等特別有用。這真的是你想要的,以及這些東西應該工作的方式。但是,我還沒有發現在Python中的等價物。 Perl比Python有更靈活和更強大的Unicode支持,並且在字符串方面很出色,所以你可能會考慮它。 – tchrist 2013-01-10 00:56:54