JS でのダイアクリティカル正規化と NFKD のハングル分解問題
TypeScript
バックエンド
検索
JS で文字列のダイアクリティカルマークを除去する際、NFKD で分解し結合文字(U+0300–U+036F)を削除する手法は Latin 系には有効だが、ハングル等の precomposed 文字を Jamo に分解してしまう副作用がある。検索用途でインデックス側がこの分解をしない場合、クエリ側だけ分解されてヒットしなくなる回帰が起きる。対処は結合文字除去後に .normalize('NFC') で再合成すること。これで Latin 系は asciifolding 相当の結果のまま、ハングルや漢字は元の合成形に戻る。なお NFKD は đ/ø/ł/æ/ß のような単独 codepoint の Latin 拡張は分解しないため取りこぼす。これらまで網羅したい場合は Lucene ASCIIFoldingFilter の JS 移植(fold-to-ascii の foldMaintaining)を使う(foldReplacing は変換不能文字を削除するので漢字/ハングルが消える点に注意)。