Unicode正規化とZalgoテキスト
Unicode正規化形式(NFC、NFD、NFKC、NFKD)がZalgoテキストとどのように相互作用するか、正規化だけではZalgo結合マークを除去できない理由を理解します。
Technical
詳細な説明
Unicode正規化 vs Zalgo
よくある誤解は、Unicode正規化がZalgoテキストを修正できるというものです。実際には、正規化形式は正準等価性を処理するもので、過剰な結合マークは扱いません。
4つの正規化形式
| 形式 | 名前 | 効果 |
|---|---|---|
| NFC | 正準分解+合成 | 合成済み文字を構成 |
| NFD | 正準分解 | 基底+結合に分解 |
| NFKC | 互換分解+合成 | NFCに加え互換文字も処理 |
| NFKD | 互換分解 | NFDに加え互換文字も処理 |
正規化がZalgoを除去しない理由
正規化は正準等価性のみを扱います。「余分な」結合マークは除去しません:
const zalgo = "H\u0300\u0301\u0302\u0303\u0304\u0305";
const nfc = zalgo.normalize('NFC');
// nfcにはすべての結合マークがそのまま含まれる
正しいアプローチ
Zalgoを除去するには、UnicodeのGeneral Categoryで結合マークを明示的にフィルタリングする必要があります:
text.replace(/\p{Mn}/gu, '');
ユースケース
正規化とZalgoの相互作用を理解することは、正規化がテキスト入力をサニタイズすると仮定する開発者にとって重要です。敵対的なUnicode入力を正しく処理する堅牢なテキスト処理パイプラインの構築に不可欠です。