Fra*_*hen 7 python unicode python-unicode
鉴于重音的unicode字样u'??????'
,我需要剥离acute(u'?????'
),并将重音格式更改为u'???+??'
,其中'+'
代表前一个字母的锐角.
我现在所做的是使用一个有效且无法完成符号的字典:
accented_list = [u'??', u'??', u'??', u'??', u'??', u'??', u'??', u'??', u'??']
regular_list = [u'?', u'?', u'?', u'?', u'?', u'?', u'?', u'?', u'?']
accent_dict = dict(zip(accented_list, regular_list))
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
def changeAccentFormat(word):
for letter in accent_dict:
if letter in word:
its_index = word.index(letter)
word = word[:its_index + 1] + u'+' + word[its_index + 1:]
return word
Run Code Online (Sandbox Code Playgroud)
但是,它当然不能按预期工作.我注意到这段代码:
>>> word = u'??????'
>>> for letter in word:
... print letter
Run Code Online (Sandbox Code Playgroud)
给
?
?
?
´
?
?
Run Code Online (Sandbox Code Playgroud)
(好吧,我没想到会出现空白符号,但仍然如此).所以我想知道,最简单的生产方式是[u'?', u'?', u'??', u'?', u'?']
什么?或者也许有一些方法可以解决我的问题没有它?
首先,关于迭代字符而不是字节,你已经做得对了 - 你word
是一个unicode对象,而不是一个编码的字节串.
现在,对于Unicode中的组合字符:
对于包含组合字符的许多字符,有一个组合和分解形式的写入它,组成一个代码点,并分解两个(或更多?)代码点的序列:
所以在Python中,您既可以编写任何一种形式,也可以在显示时将其组合成相同的字符:
>>> combining_cedilla = u'\u0327'
>>> c_with_cedilla = u'\u00e7'
>>> letter_c = u'\u0063'
>>>
>>> print c_with_cedilla
ç
>>> print letter_c + combining_cedilla
ç
Run Code Online (Sandbox Code Playgroud)
为了在组合形式和分解形式之间进行转换,您可以使用unicodedata.normalize()
:
>>> import unicodedata
>>> comp = unicodedata.normalize('NFC', letter_c + combining_cedilla)
>>> decomp = unicodedata.normalize('NFD', c_with_cedilla)
>>>
>>> print comp
ç
>>> print decomp
c?
Run Code Online (Sandbox Code Playgroud)
(NFC
代表"正常形式C"(组成),和NFD
"正常形式D"(分解).
它们仍然是不同的形式 - 一个包含一个代码点,另一个包含两个:
>>> comp == decomp
False
>>> len(comp)
1
>>> len(decomp)
2
Run Code Online (Sandbox Code Playgroud)
但是,在你的情况下,似乎没有一个组合字符用于?
带有重音的小写字母(有一个用于?
重音坟墓)