ゼロ幅文字と不可視の文字列長
ゼロ幅ジョイナー、ゼロ幅スペース、および文字列長に加算されるがユーザーには見えないその他の不可視Unicode文字を探索します。
Emoji
詳細な説明
ゼロ幅文字:不可視だがカウントされる
いくつかのUnicode文字は視覚的な幅がゼロですが、文字列長にカウントされます。これらはバリデーション、比較、ストレージに微妙なバグを引き起こす可能性があります。
一般的なゼロ幅文字
| 文字 | コードポイント | UTF-8バイト | 目的 |
|---|---|---|---|
| ゼロ幅スペース (ZWSP) | U+200B | 3 | 単語区切りのヒント |
| ゼロ幅ジョイナー (ZWJ) | U+200D | 3 | 絵文字シーケンスの結合 |
| ゼロ幅非ジョイナー (ZWNJ) | U+200C | 3 | リガチャの防止 |
| ワードジョイナー (WJ) | U+2060 | 3 | 改行の防止 |
| ソフトハイフン | U+00AD | 2 | オプションのハイフネーションポイント |
| BOM | U+FEFF | 3 | エンコーディングインジケーター |
絵文字におけるZWJ
ゼロ幅ジョイナー(U+200D)は複雑な絵文字を可能にするものです:
👩 + ZWJ + 🚀 = 👩🚀(女性宇宙飛行士)
各ZWJは3 UTF-8バイトと1コードユニットを文字列に追加しますが、可視幅はありません。
隠しテキスト攻撃
ゼロ幅文字は以下に使用できます:
- フィルターの回避:禁止語の間にZWSPを挿入して検出を逃れる
- テキストの透かし:コピー&ペーストを追跡するための不可視パターンの埋め込み
- バリデーションの破壊:長さがゼロでない、一見空の入力
"".length // 0
"\u200B".length // 1 (空に見えるが空ではない!)
"\u200B\u200C\u200D".length // 3 (3つの不可視文字)
検出と除去
// ゼロ幅文字の検出
const hasZeroWidth = /[\u200B\u200C\u200D\u2060\uFEFF]/.test(str);
// ゼロ幅文字の除去
const clean = str.replace(/[\u200B\u200C\u200D\u2060\uFEFF]/g, "");
文字列長さ計算ツールの書記素ブレークダウンは、各位置の正確なコードポイントを表示して、これらの不可視文字を識別するのに役立ちます。
ユースケース
入力サニタイゼーション、コンテンツモデレーション、またはスパム対策システムを構築する際、ゼロ幅文字を検出することで、フィルターの回避、隠しテキスト攻撃、および予期しないデータベースやAPIエラーを引き起こす不可視の文字列長の膨張を防止できます。