Unicode の正規化
Python の unicodedata モジュールは、Unicode 文字列を操作するためのメソッドを提供します。一般的なタスクの 1 つは、可能な限り単純な表現を使用するように文字列を正規化し、重複した Unicode エンティティを排除することです。
問題
次の例を考えてみましょう:
import unicodedata char = "á" len(char) [unicodedata.name(c) for c in char]
結果は、文字列「á」が最も単純な形式「LATIN SMALL LETTER A」に正規化されていることを示しています。急性」。ただし、文字の順序を逆にすると、
char = "á" len(char) [unicodedata.name(c) for c in char]
結果は、「LATIN SMALL LETTER A」と「COMBINING ACUTE ACCENT」という 2 つの別々の文字に分解されます。この動作は一貫性がなく、文字列操作が複雑になる可能性があります。
解決策
Unicode 文字列を一貫して正規化するには、unicodedata モジュールの .normalize() 関数を使用します。 NFC 形式 (合成された通常形式) は合成された文字を返しますが、NFD 形式 (分解された通常形式) は分解されて結合された文字を返します。
たとえば、上記と同じ Unicode の組み合わせを使用します。
print(ascii(unicodedata.normalize('NFC', '\u0061\u0301'))) print(ascii(unicodedata.normalize('NFD', '\u00e1')))
出力は、NFC 形式が合成文字「é」を生成するのに対し、NFD 形式は分解されたシーケンスを生成することを示しています。 "au0301".
追加の形式、NFKC および NFKD は、互換性コードポイントを処理します。これらの形式は、互換性文字を正規形式に置き換えます。例:
unicodedata.normalize('NFKC', '\u2167')
ローマ数字の 8 コードポイント (U 2167) を ASCII シーケンス「VIII」に変換します。
すべての変換が可換であるわけではないことに注意してください。合成された文字を分解して再合成すると、元のシーケンスが得られない場合があります。 Unicode 標準では、この動作の例外のリストが管理されています。
以上がPython の「unicodedata」モジュールは一貫した操作のために Unicode 文字列をどのように正規化できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。