如何迭代unicode符号,而不是python中的字节?

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'?']什么?或者也许有一些方法可以解决我的问题没有它?

Luk*_*raf 6

首先,关于迭代字符而不是字节,你已经做得对了 - 你word是一个unicode对象,而不是一个编码的字节串.

现在,对于Unicode中的组合字符:

对于包含组合字符的许多字符,有一个组合分解形式的写入它,组成一个代码点,并分解两个(或更多?)代码点的序列:

c与cedilla的组合和分解形式

参见U + 00E7,U + 0063U + 0327

所以在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)

但是,在你的情况下,似乎没有一个组合字符用于?带有重音的小写字母(有一个用于?重音坟墓)