あなたの質問の用語について少し混乱があります。発音区別符号は、文字やその他の文字に追加できるマークですが、通常はそれ自体では機能しません。(Unicodeは、より一般的な用語である結合文字も使用します。)合成済み文字をコンポーネントnormalize('NFD', ...)
に変換することは何ですか。
とにかく、答えは–は合成済み文字ではないということです。それは活版印刷の合字です:
>>> 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にはそれほど多くの合字はありません。)