DESIGN / CODE / INFRA / AI

解説

見た目が似た文字を同じにしてよい?AIの照合前にUnicode正規化を確認しよう

AIへ重複を調べてもらうとき、全角と半角をそろえればよいのかな。文字をそろえる操作は便利だけれど、同じにしてよい違いかを先に確認しよう。

見た目が似た文字を同じにしてよい?AIの照合前にUnicode正規化を確認しよう
保存リストを見る →
この記事の道しるべ 5項目

AIへ重複を調べてもらうとき、全角と半角をそろえればよいのかな。文字をそろえる操作は便利だけれど、同じにしてよい違いかを先に確認しよう。

ここでは架空の短い文字列を、PythonのUnicode正規化で比べる。実際の利用者IDやパスワードは変換しない。元の値を別に残して、確認用の値を作る練習だよ。

見た目だけでは文字の構成が分からない

Unicodeは文字を扱うための仕組み。たとえばéは、一つの文字として表す形と、eへ結合するアクセントを付ける形がある。似た表示でも、文字列の構成が同じとは限らない。

正規化にはNFC、NFD、NFKC、NFKDなどの形式があり、互換的な文字の変換まで行うかなどが違う。何でも同じにする一つの万能な処理ではないよ。

Pythonで違いを確かめる

import unicodedata as ud
a = 'é'
b = 'e\u0301'
print(a == b)
print(ud.normalize('NFC', a) == ud.normalize('NFC', b))
print(ud.normalize('NFKC', 'ABC'))
print(ud.normalize('NFKC', 'Ⅳ'))

この例は、順にFalse、True、ABC、IVとなる。NFCで二つのアクセント表記をそろえる場合と、NFKCで全角やローマ数字の表記まで変える場合を分けて見よう。

同じにする目的を決める

検索しやすい比較用の文字列を作る目的と、元の正式な識別子を保存する目的は違う。製品名、数式、法的な文書などでは、表記の違いに意味がある場合もある。

AIへの依頼でも「元の文字列、比較用の変換後、適用した形式、衝突した行を別の欄へ出してください。原文を上書きしないでください」と条件をそろえよう。

変換後の衝突を読む

  1. 元の値を保持する。
  2. 比較の目的と正規化の形式を決める。
  3. 変換後に同じ値へ集まった記録を調べる。
  4. 意味のある違いを消していないか確認する。
  5. 問題があれば、条件を戻して原文から再確認する。

正規化は、似た字形の偽装や不正入力をすべて見抜く仕組みでもない。安全上の識別や認証には、対象システムの仕様に沿う確認が必要だよ。

記録の単位はIDと表示名の重複、表の対応は一対多の結合へ。

参照した公式資料

確認日:2026年10月24日。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。