ホームページ > バックエンド開発 > Python チュートリアル > Python の「unicodedata」モジュールは一貫した操作のために Unicode 文字列をどのように正規化できるのでしょうか?

Python の「unicodedata」モジュールは一貫した操作のために Unicode 文字列をどのように正規化できるのでしょうか?

DDD
リリース: 2024-12-01 02:05:09
オリジナル
218 人が閲覧しました

How Can Python's `unicodedata` Module Normalize Unicode Strings for Consistent Manipulation?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート