我理解unicodedata.normalize
将变音符号转换为非变音符号:
import unicodedata
''.join( c for c in unicodedata.normalize('NFD', u'B\u0153uf')
if unicodedata.category(c) != 'Mn'
)
我的问题是(并且可以在这个例子中看到):unicodedata有没有办法将组合的char变音符号替换为对应的? (你'变成'o'')
如果不是,我认为我将不得不为这些打击,但是我不得不与所有的uchars和他们的同行一起编写我自己的词典并完全忘记unicodedata
...
答案 0 :(得分:6)
您的问题中的术语存在一些混淆。 diacritic是一个可以添加到字母或其他字符的标记,但通常不能单独使用。 (Unicode也使用更通用的术语组合字符。)normalize('NFD', ...)
做的是将precomposed characters转换为其组件。
无论如何,答案是 - 不是预先组合的角色。这是一个typographic ligature:
>>> unicodedata.name(u'\u0153')
'LATIN SMALL LIGATURE OE'
unicodedata
模块没有提供将连字分割成其部分的方法。但是数据存在于角色名称中:
import re
import unicodedata
_ligature_re = re.compile(r'LATIN (?:(CAPITAL)|SMALL) LIGATURE ([A-Z]{2,})')
def split_ligatures(s):
"""
Split the ligatures in `s` into their component letters.
"""
def untie(l):
m = _ligature_re.match(unicodedata.name(l))
if not m: return l
elif m.group(1): return m.group(2)
else: return m.group(2).lower()
return ''.join(untie(l) for l in s)
>>> split_ligatures(u'B\u0153uf \u0132sselmeer \uFB00otogra\uFB00')
u'Boeuf IJsselmeer ffotograff'
(当然你不会在实践中这样做:你会预先处理Unicode数据库以生成你在问题中建议的查找表。在Unicode中没有那么多连字。)