🔤 Unicode正規化(NFC/NFD/NFKC/NFKD)
テキストをUnicodeの4つの正規化形式(NFC・NFD・NFKC・NFKD)に変換して並べて比較します。各形式のコードポイント数・UTF-8バイト長と、元テキストから変化したかどうかを表示。濁点「が」の合成/分解や、全角数字・㍿などの互換文字の変換を確認でき、検索・ファイル名・パスワード照合での「見た目は同じなのに一致しない」問題の対策に使えます。処理はすべてブラウザ内で行い、入力内容は送信されません。
入力
代表的な変換例
クリックすると上の入力欄にセットされます。
解説
Unicode正規化とは、見た目が同じでも内部のコードポイント列が異なる文字を、決められた規則でそろえる処理です。たとえば濁点付きの「が」は、1つのコードポイント U+304C として表す方法(合成済み)と、「か」(U+304B) と結合用の濁点 (U+3099) の2つで表す方法(分解)があります。人間の目にはどちらも同じ「が」ですが、コンピュータにとっては別のデータで、そのまま比較すると一致しません。本ツールは入力テキストを NFC・NFD・NFKC・NFKD の4形式に一度に変換し、結果とコードポイント数・バイト長を並べて比較できます。
4形式は「合成するか分解するか」と「正準等価か互換等価か」の組み合わせです。NFC(正規合成)は結合文字を可能な限り合成した形で、Webページやテキスト保存で最も一般的です。NFD(正規分解)は基底文字と結合文字に分けた形で、macOSのファイル名内部で使われます。NFKC・NFKD はここに「互換等価」を加え、全角英数・丸数字①・㍿・㎡・合字fi といった“見た目の派生”を通常の文字に置き換えます(NFKCは合成、NFKDは分解)。実際に本ツールで確認すると、①はNFKCで「1」、㍿はNFKCで「株式会社」、全角の「A123」はNFKCで「A123」になります。
正規化はテキスト処理の「不一致」を防ぐ実務で役立ちます。検索では、入力欄の文字とデータ側の文字を同じ形式(多くはNFKC)にそろえてから照合すると、全角・半角や合成・分解の違いで取りこぼしません。ファイル名では、macOS(NFD寄り)とWindows/Linux(NFCが多い)の間で同じ名前が別物と扱われ、重複や検索漏れが起きることがあります。パスワードやIDの照合でも、入力方法によって濁点が合成/分解のどちらで入るかが変わり、「正しいはずなのに通らない」原因になります。どの形式でどう変わるかを目で確かめられるのが本ツールの狙いです。
コードポイント数は Array.from によるコードポイント単位の長さで、絵文字などのサロゲートペアも1文字として数えます。バイト長は UTF-8 でエンコードしたときの長さです。分解(NFD/NFKD)では結合文字が増えるためコードポイント数・バイト長が増え、互換変換(NFKC/NFKD)では㍿→株式会社のように文字数が増える場合と、全角→半角のようにバイト長が減る場合の両方があります。処理はすべてブラウザ内の String.prototype.normalize() で行い、入力した内容はどこにも送信されません。オフラインでも利用できます。
よくある質問
NFCとNFDの違いは何ですか?
どちらも「正準等価(見た目・意味が同じ文字)」の範囲でそろえる形式で、NFCは結合文字を合成した形、NFDは基底文字+結合文字に分解した形です。例えば『が』はNFCでは U+304C の1コードポイント、NFDでは『か』(U+304B)+濁点(U+3099) の2コードポイントになります。文字自体の見た目は変わりません。
NFKCやNFKDは何が違うのですか?
頭の「K」は互換(compatibility)を意味し、正準等価に加えて『見た目の派生』も通常文字に置き換えます。丸数字①→1、㍿→株式会社、全角A→A、合字fi→fi、上付きの㎡→m2 などです。NFKCは合成、NFKDは分解まで行います。元の見た目が失われるため、表示用ではなく検索やキー照合の内部処理に向きます。
検索の不一致対策にはどの形式を使えばよいですか?
多くの場合はNFKCが実用的です。全角・半角、①などの互換文字、濁点の合成/分解の違いをまとめて吸収できるためです。ただしNFKCは㍿→株式会社のように意味が変わって見える変換も含むので、用途によってはNFCで合成だけそろえる方が無難な場合もあります。実際の入力例で挙動を確かめてから選ぶことをおすすめします。
コードポイント数と文字数(length)は違いますか?
違うことがあります。本ツールのコードポイント数は絵文字などサロゲートペアも1と数えますが、JavaScriptの文字列 length は16ビット単位のため絵文字を2と数えます。また分解形(NFD/NFKD)では結合文字が別コードポイントになるため、合成形より数が増えます。
なぜmacOSとWindowsでファイル名が食い違うのですか?
macOSはファイル名を内部でNFDに近い分解形で扱う傾向があり、Windows/LinuxはNFC(合成形)で扱うことが多いためです。濁点付きの名前などで、見た目は同じでもコードポイント列が異なり、別ファイル・重複・検索漏れとして現れます。どちらかの形式にそろえると解消しやすくなります。
㍿がNFKCで『株式会社』になるのは正しい動作ですか?
はい。㍿(U+337F)は「株式会社」を1文字にまとめた互換文字で、互換分解の定義により4文字『株式会社』へ展開されます。同様に㍑→リットル、℃→°C など、互換文字は通常の文字列に置き換わります。本ツールでも実装(String.prototype.normalize)で確認しています。
入力した文字はサーバーに送られますか?
送られません。正規化はすべてブラウザ内の標準API(String.prototype.normalize)で行い、入力内容はどこにも送信されません。オフラインでも利用できます。
絵文字や結合済みの絵文字も正規化されますか?
基本的な絵文字は正規化で変化しません。肌色や国旗などの結合絵文字(ZWJシーケンスや異体字セレクタを含むもの)は複数コードポイントのまま保持され、正規化では分解・合成されません。本ツールではコードポイント内訳表示でその構成を確認できます。