ZalgoテキストをBrowser内で生成・解除する
文字の上・中央・下、強度、変換率、対象文字、再現用シードを指定し、結果と統計を確認できます。解除時は対象範囲を2モードから選べます。
Zalgoテキスト生成・解除ツールを開く結論:既知Markだけを先に除去し、全Mark除去は比較用Copyで試す
「このツールで使う文字のみ」は内蔵Poolと一致するMarkだけを除去します。「すべての結合文字」はUnicode Mark全般を対象にするため、外部Zalgoへ強い一方で通常の言語表記を壊し得ます。
除去処理から元のMarkの目的は推定できません。元から存在したアクセントと後付けZalgoが同じCode Pointなら、Originalなしに完全区別できません。
解除結果を原文へ上書きする前に、Originalと安全寄り解除と全Mark解除の3つを比較してください。
解除方法を選ぶ判断材料
生成元が分かるか、通常のアクセントを含むか、日本語がNFD相当の列かを確認します。
本ツール生成と分かる場合は既知Markだけ、出所不明で読めない場合に限り全Mark解除をCopyへ試します。
| 確認項目 | 確認方法 | 判断 |
|---|---|---|
| 生成元 | 本ツールか確認 | 既知Mark解除 |
| 言語 | アクセント・濁点を確認 | 全Mark解除に注意 |
| 残存Mark | Code Point解析 | 必要なら強力解除 |
| 復元 | Originalと比較 | 一致しなければ保存しない |
Zalgoを段階的に解除する手順
- 入力を複製してOriginalを保持します。
- 解除対象を「このツールで使う文字のみ」にします。
- Zalgoを解除し、残存Markと読みやすさを確認します。
- 必要な場合だけ「すべての結合文字」を別Copyへ試します。
- アクセント・濁点・意味・文字数を比較して採用結果を決めます。
外部GeneratorのMark Poolは異なるため、安全寄り解除で一部が残ることは失敗ではありません。
解除しても完全復元できない条件
- Originalを保存していない
- Zalgo追加前からCombining Markがあった
- 貼り付け先ですでに正規化・置換された
- Base Character自体が削除・変更された
- 複数GeneratorのMarkが混在する
ZalgoはフォントではなくUnicode結合文字の並び
| 表示例 | 内部表現 | 意味 |
|---|---|---|
| A | U+0041 | Base Characterだけ |
| Á | U+0041 + U+0301 | BaseにCombining Acute Accentを1つ追加 |
| Zalgo風A | U+0041 + 複数のMark | Baseへ上・中央・下のMarkを重ねた文字列 |
| CSS Font変更 | U+0041のまま | Code Pointを変えずGlyphだけを変える |
UnicodeのGeneral_Category MにはNonspacing Mark、Spacing Combining Mark、Enclosing Markが含まれます。Zalgo Generatorで使う文字の多くは結合記号ですが、結合文字はアクセント、発音記号、濁点・半濁点など通常の言語表記にも必要です。「Markなら不要」「U+0300~U+036Fだけが全Combining Mark」とは判断しません。
解除は安全寄りと強力な方法を使い分ける
| 解除方法 | 削除対象 | 向く場面 | 主なリスク |
|---|---|---|---|
| このツールで使う文字のみ | 内蔵Zalgo Mark Poolに含まれる文字 | 本ツールで生成した出力、通常のアクセントを残したい場合 | 外部Generator独自のMarkが残ることがある |
| すべての結合文字 | Unicode Property Escapeの\p{M}相当 | 出所不明のZalgoを強く除去したい場合 | アクセント、分解済み濁点・半濁点、他言語の記号まで失う可能性 |
| 元データへ戻す | 編集前に保持したOriginal | 完全な復元が必要な場合 | Originalがなければ利用できない |
「すべての結合文字」は万能な安全解除ではありません。重要な文章はOriginalを保持し、解除前後を比較してから保存・送信してください。
見た目の1文字と内部の長さを分けて数える
| 単位 | Zalgoで増えるか | 確認用途 |
|---|---|---|
| Grapheme Cluster | BaseとMarkが1つの書記素に見える場合は増えない | 利用者が認識する文字数、Cursor移動 |
| Code Point | 追加したMarkごとに増える | Unicode解析、生成上限、文字列走査 |
| UTF-16 Code Unit | BMP内のMarkは通常1ずつ増え、補助平面文字は2になる | JavaScript String.length、Legacy API |
| UTF-8 Byte | MarkのEncoding分だけ増える | DB列、API Payload、File Size |
JavaScriptのString.lengthはUTF-16 Code Unit数で、見た目の文字数ではありません。現行ツールはIntl.Segmenterが利用できる場合にGrapheme単位で入力を分割し、出力はArray.fromでCode Point数を集計します。保存先の上限は書記素数だけでなくCode Point数とByte数でも確認します。
NormalizationだけでZalgo解除は完了しない
| 形式 | 主な処理 | Zalgoへの注意 |
|---|---|---|
| NFC | Canonical Decomposition後に可能な列をComposition | 並び替えや合成は行うが、大量のMarkを削除しない |
| NFD | Canonical Decomposition | 合成済みアクセントや濁点がBase + Markへ分かれ、Mark数が増える場合がある |
| NFKC | Compatibility Decomposition後にComposition | 互換表現を変えるがZalgo解除専用ではなく、意味のある表記差も変え得る |
| NFKD | Compatibility Decomposition | 互換分解とCanonical Decompositionで復元不能な差が増える場合がある |
正規化は等価なUnicode表現を扱いやすくする仕様で、不要な装飾を自動判定する機能ではありません。解除処理の前後でNFCを使う設計はあり得ますが、目的、保存形式、Round Trip要件を決めてから適用します。現行ZalgoツールはNormalizationを実行しません。
DevelopToolsで確認できる機能と境界
| 項目 | 現行ツールの動作 |
|---|---|
| 生成位置 | 文字の上・中央・下を個別に選択し、選んだMark Poolから結合文字を追加する |
| 強度 | 弱い・標準・強い・最大と、1~20のカスタム強度を指定できる |
| 対象 | 文字は対象。数字、空白、記号・絵文字、選択範囲は設定で切り替える。改行は常に保持する |
| 再現性 | 同じ入力・設定・シードなら同じ生成結果を再現できる |
| 解除 | 「このツールで使う文字のみ」と「すべてのUnicode結合文字」の2モードを選べる |
| 統計 | 入力書記素数、出力Code Point数、変換文字数、追加・除去Mark数、UTF-8 Sizeを表示する |
| 上限 | 入力50,000書記素、出力500,000 Code Point、1書記素40Markまでに制限する |
| 未対応 | NFC/NFD/NFKC/NFKDの実行、Unicode名一覧、Mark位置の個別編集、完全な元文字列復元は行わない |
| Privacy | 入力と結果をServerへ送信せず、設定だけをBrowserのLocalStorageへ保存する |
解除モード名は現行画面では「すべての結合文字」と「このツールで使う文字のみ」です。本記事では後者を安全寄り、前者を強力だが破壊的になり得る解除として説明します。画面に存在しないSafe Remove/Aggressive Removeというボタン名は案内しません。
仕様確認に使う一次資料
- Unicode UAX #15:Unicode Normalization Forms
- Unicode UAX #29:Unicode Text Segmentation
- Unicode UAX #44:Unicode Character Database
- MDN:Unicode character class escape
- MDN:Intl.Segmenter
- MDN:String.length
NormalizationはUAX #15、Grapheme ClusterはUAX #29、General_CategoryやCombining ClassはUAX #44を基準にします。JavaScriptのUnicode Property Escape、Intl.Segmenter、String.lengthはMDNの仕様説明と照合し、特定のBlockだけを全Markとして扱いません。
具体例:日本語とアクセントを含む文字列を解除する
既知Mark解除後に「が」「é」が維持されるかを確認します。
全Mark解除で「か」「e」へ変わる場合があるため、安全寄りの結果を優先します。
- Originalを保持
- 既知Mark解除
- 日本語・Latinを比較
- 残存Markを解析
- 必要時だけ全Mark解除
見た目が読みやすくなっても、言語情報が失われていないか確認します。
よくある質問
- Zalgoテキストは特殊フォントですか?
- 違います。通常のBase Characterへ複数のUnicode結合文字を追加した文字列です。Fontによって重なり方は変わりますが、CopyされるのはCode Point列です。
- すべての結合文字を消せば安全に元へ戻せますか?
- 保証できません。通常のアクセント、発音記号、分解済みの濁点・半濁点などもMarkです。まず本ツール既知のMarkだけを除去し、必要な言語情報が残るか確認してください。
- 入力や生成結果はServerへ送信されますか?
- 現行Zalgoテキスト生成・解除ツールはBrowser内で処理し、入力と結果をServerへ送信しません。LocalStorageへ保存するのは表示・生成設定だけです。