0
0

【Python】unicodedata.normalize('NFKC')について。互換分解してから再度合成するとは?

Posted at

概要

Pythonのunicodedata.normalizeNFKCを使ってみたので、サンプルコードと共に紹介します。

Unicodeの正規化のNFKCとは?

unicodedata.normalizeは、そのまま「Unicodeの正規化」という意味です。
Wikipediaは以下のように説明されています。

Unicode正規化(ユニコードせいきか、英語: Unicode normalization)とは、等価な文字や文字の並びを統一的な内部表現に変換することでテキストの比較を容易にする、テキスト正規化処理の一種である。

Pythonで使うunicodedataモジュールとは、Unicode文字列を正規化するためのライブラリ(関数)です。

また、NKFCについて、公式ドキュメントには以下のように記載がありました。

正規形 KC (NFKC) は、互換分解を適用してから、標準分解を適用します。

2つのunicode文字列が正規化されていて人間の目に同じに見えても、片方が結合文字を持っていてもう片方が持っていない場合、それらは完全に同じではありません。

よく意味がわかりませんね...。
わかりやすく解釈すると、「見た目が似ているが異なる意味を持つ文字」を統一してくれる働きを持っているという意味です。

例えば、全角文字を半角文字に変換する、という作業が「すべての互換文字を、等価な文字で置換」という意味に置き換えられますね。

サンプルコード

早速、pythonでサンプルコード。

text = "カタカナ"
normalized_text = unicodedata.normalize('NFKC', text)
print(normalized_text)
# カタカナ

text = "123"
normalized_text = unicodedata.normalize('NFKC', text)
print(normalized_text)
# 123

上記結果でわかるように、半角のカタカナ(カタカナ)は全角のカタカナ(カタカナ)に、
全角の数字(123)は半角の数字(123)にそれぞれ正規化されています。

個人的に注意が必要と感じたのが「10m²」といった上付き文字が通常の文字に変換される点です。

text = "10m²"
normalized_text = unicodedata.normalize('NFKC', text)
print(normalized_text)
# 10m2

上記のように「m2」という形で出力されます。
ユーザーに見えるような場所で使う場合は、こういった細かい点の確認が必要でしょう。

NKFCの仲間

unicodedata.normalizeには、他に以下の正規化形式があります。

名称  日本語名称 説明
NFD 正規化形式D 文字は正準等価性によって分解される。
NFC 正規化形式C 文字は正準等価性によって分解され、再度合成される。結果として文字の並びが変換前と変わることもありうる。
NFKD 正規化形式KD 文字は互換等価性によって分解される。
NFKC 正規化形式KC 文字は互換等価性によって分解され、正準等価性によって再度合成される。

以下記事に詳細な記載がありますのでご参考ください。
先ほどの上付き文字についても、NFDNFCであれば変換されない、など説明されています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0