初めに
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で正規化した文字列
検索や重複チェックには便利ですが、記号や書式の違いに意味がある文章では、適用範囲を決めて使うのがよいです。