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入力を正しく処理する堅牢なテキスト処理パイプラインの構築に不可欠です。

試してみる — Zalgo Text Generator

フルツールを開く