4

unicodedata.normalize分音記号を非分音記号の対応するものに変換することを理解しています:

import unicodedata
''.join( c for c in unicodedata.normalize('NFD', u'B\u0153uf') 
            if unicodedata.category(c) != 'Mn'
       )

私の質問は (そしてこの例で見ることができます): unicodedata には、結合された char 発音記号を対応するものに置き換える方法がありますか? (u'œ' は 'oe' になります)

そうでない場合は、これらに打撃を与える必要があると思いますが、すべての uchars とそれに対応するものを使用して自分の辞書をコンパイルし、完全に忘れてしまうかもしれませんunicodedata...

4

1 に答える 1

6

あなたの質問の用語について少し混乱があります。発音区別符号は、文字やその他の文字に追加できるマークですが、通常はそれ自体では機能しません。(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にはそれほど多くの合字はありません。)

于 2012-09-12T15:57:47.890 に答える