1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NFKCとは? 全角・半角の表記ゆれをPythonでそろえてみる

1
Posted at

初めに

ABC と ABC。
カタカナ と カタカナ。

人が読むと同じ内容ですが、プログラムでは異なる文字列です。そのまま比較すると、検索漏れや重複登録につながることがあります。

こうした文字表現の違いをそろえるときに使えるのが、NFKCです。

1. NFKCは、Unicodeの正規化方式の1つ

NFKC(Normalization Form KC)は、Unicodeで定義されている文字列の正規化方式です。

正式には、互換分解を行った後、正準合成を行う処理です。

たとえば、全角英数字や半角カタカナ、丸付き数字などを、互換性のある文字表現に変換します。

変換前 NFKC適用後
ABC123 ABC123
カタカナ カタカナ
ガ ガ
① 1
㍿ 株式会社

英数字は半角になり、半角カタカナは全角になります。

つまり、単に「すべて半角にする」処理ではありません。

2. Pythonでは、1行で使える

Pythonの標準ライブラリには、unicodedata.normalize() が用意されています。追加のパッケージは不要です。

import unicodedata

text = "ABC123 カタカナ ① ㍿"
normalized = unicodedata.normalize("NFKC", text)

print(normalized)
# ABC123 カタカナ 1 株式会社

文字列を比較する場合は、両方に同じ処理を適用します。

def normalize(text):
    return unicodedata.normalize("NFKC", text)

print(normalize("ABC") == normalize("ABC"))
# True

print(normalize("ガ") == normalize("ガ"))
# True

入力元によって文字の表現が違っていても、正規化した値で照合できます。

3. NFCとの違いは、どこまでそろえるか

Unicodeには、NFCという正規化方式もあります。

たとえば、ガ は1文字でも、カ と結合濁点の組み合わせでも表現できます。NFCは、こうした同じ文字の表現の違いをそろえます。

NFKCはさらに、全角・半角や丸付き数字など、互換性のある文字同士の違いもそろえます。

入力 NFC NFKC
A A A
① ① 1
ガ ガ ガ

表記ゆれを吸収したい場面では、NFKCが役立ちます。

4. ただし、元の表記は残しておく

NFKCでは、① と 1 のような区別も失われます。変換後の文字列だけでは、元の表記に戻せません。

実装では、次のように分けると扱いやすいです。

  • 表示・保存用:元の文字列
  • 検索・比較用:NFKCで正規化した文字列

検索や重複チェックには便利ですが、記号や書式の違いに意味がある文章では、適用範囲を決めて使うのがよいです。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?