見た目が同じなのに一致しない文字列を一致させる
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バージョンに従います。