Unicode正規化の種類
変換前の文字列 (Edge 129 で確認)
code:origin.js
s = "ががガ11aa".split("")
NFC - Normalization Form Canonical Composition code:nfc.js
s = "ががガ11aa".normalize("NFC").split("")
全角/半角はそのまま
全角カタカナの濁点/半濁点が合成される。半角カタカナは合成されない
NFD - Normalization Form Canonical Decomposition code:nfd.js
s = "ががガ11aa".normalize("NFD").split("")
全角/半角はそのまま
濁点/半濁点が分解される
NFKC - Normalization Form Compatibility Composition code:nfkc.js
s = "ががガ11aa".normalize("NFKC").split("")
半角カタカナは全角カタカナに、全角英数は半角英数に変換される
濁点/半濁点が合成される
NFKD - Normalization Form Compatibility Decomposition code:nfkd.js
s = "ががガ11aa".normalize("NFKD").split("")
半角カタカナは全角カタカナに、全角英数は半角英数に変換される
濁点/半濁点が分解される
その他
Apache Lucene の CjkWidth フィルタは「半角カタカナ→全角カタカナ」「全角英数→半角英数」に変換するが、該当フィルタのドキュメントに「NFKC/NFKD に対する事実上のサブセットと言える」と書かれている NFKD/NFKC は全角カタカナ/半角英数への変換を行うと断言してもよさそうかも
ElasticSearch の公式記事では NFKC が使われている
参考
macOSのファイルシステムHFS+ではNFDの変種が用いられる(U+2000〜U+2FFF、U+F900〜U+FAFF、U+2F800〜U+2FAFFは分解されない)。