見た目が同じなのに一致しない文字列を一致させる

Macのファイル名や貼り付けテキストが、見た目は同じなのに一致しない。原因はUnicode正規化であることが多いです。

このガイドで使う道具

やりたいこと

検索がヒットしない、インポートが存在しない重複を報告する、ファイルが消えたように見える。原因は目に見えないことが多く、同じアクセント付き文字が1コードポイント(合成済み)でも、文字+結合アクセント(分解済み)でも表せるためです。macOSのファイル名は分解形で、多くのシステムは合成形を前提にします。

形式を比較する

テキストを貼ると、NFC・NFD・NFKC・NFKDの4形式をコードポイント数と一緒に表示します。見た目が同じ2つの入力が一致しないときは、コードポイントで比較して結合文字を含む側を確認します。

  • Web・データベース・多くの言語が期待するのはNFC(合成済み)です。比較前にNFCへ正規化します。
  • NFKC/NFKDは互換文字も畳みます。全角数字がASCIIになり、合字が分解されます。便利な場面もありますが、エンコードだけでなく文字そのものが変わります。

具体例

Windowsで入力された「José」とMacのエクスポート由来の「José」が混在するユーザーリスト。見た目は同じでもコードポイント数は4と5です。結合キーの両側をNFCに正規化すれば重複チェックが動きます。

対応範囲

正規化はエンコード差を直すもので、綴りの違いは直しません。「café」と「cafe」は別のままです。互換形式(NFKC/NFKD)は別の文字を併合することがあり(²→2)、20万文字まで。正規化はブラウザのUnicodeバージョンに従います。