Unicodeのゼロ幅文字

ZWSP、ZWNJ、ZWJ、Word Joinerを含む不可視のゼロ幅Unicode文字を発見します。コードポイント、目的、テキスト内での検出方法を解説します。

Special Characters

詳細な説明

ゼロ幅文字

ゼロ幅文字は、目に見えるレンダリングを持たないが、テキスト処理、改行、文字整形に影響を与えるUnicodeコードポイントです。肉眼では不可視であるため、バグやセキュリティ上の懸念の一般的な原因となっています。

一般的なゼロ幅文字

コードポイント 名前 略称 目的
U+200B ZERO WIDTH SPACE ZWSP オプションの改行ポイント
U+200C ZERO WIDTH NON-JOINER ZWNJ 合字形成の防止
U+200D ZERO WIDTH JOINER ZWJ 隣接文字の結合(絵文字シーケンス)
U+2060 WORD JOINER WJ 改行を防止(非推奨U+FEFFの代替)
U+FEFF BYTE ORDER MARK BOM ファイルエンコーディングマーカー
U+200E LEFT-TO-RIGHT MARK LRM LTR方向性を強制
U+200F RIGHT-TO-LEFT MARK RLM RTL方向性を強制

なぜ問題になるのか

  1. 文字列比較:同じに見える2つの文字列が隠れたゼロ幅文字で異なる場合がある
  2. データ検証:ユーザー入力に長さチェックをバイパスする不可視文字が含まれる場合がある
  3. セキュリティ:ゼロ幅文字はステガノグラフィー(メッセージの隠蔽)や紛らわしい攻撃に使用される可能性がある
  4. 検索/インデックス:隠れた文字が検索結果やデータベースの検索に影響する

Unicode Inspectorでの検出

Unicode Inspectorはゼロ幅文字を何も表示しない代わりにコードポイントラベル(例:U+200B)で表示し、即座に可視化します。

実用的なヒント

  • 比較前にString.prototype.normalize()を使用してテキストを標準化する
  • 正規表現でゼロ幅文字を除去する:/[\u200B-\u200D\uFEFF\u2060]/g
  • 文字列比較の失敗をデバッグする際に予期しないゼロ幅文字をチェックする

ユースケース

ユーザー送信テキスト内の不可視文字の問題のデバッグ、ステガノグラフィーや文字列操作攻撃の検出、隠れた文字を含むデータインポートのクリーニング、視覚的に同一の文字列が等価チェックに失敗する理由の理解に使用します。

試してみる — Unicode Inspector

フルツールを開く