ゼロ幅文字と不可視の文字列長

ゼロ幅ジョイナー、ゼロ幅スペース、および文字列長に加算されるがユーザーには見えないその他の不可視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コードユニットを文字列に追加しますが、可視幅はありません。

隠しテキスト攻撃

ゼロ幅文字は以下に使用できます:

  1. フィルターの回避:禁止語の間にZWSPを挿入して検出を逃れる
  2. テキストの透かし:コピー&ペーストを追跡するための不可視パターンの埋め込み
  3. バリデーションの破壊:長さがゼロでない、一見空の入力
"".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エラーを引き起こす不可視の文字列長の膨張を防止できます。

試してみる — String Length Calculator

フルツールを開く