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方向性を強制 |
なぜ問題になるのか
- 文字列比較:同じに見える2つの文字列が隠れたゼロ幅文字で異なる場合がある
- データ検証:ユーザー入力に長さチェックをバイパスする不可視文字が含まれる場合がある
- セキュリティ:ゼロ幅文字はステガノグラフィー(メッセージの隠蔽)や紛らわしい攻撃に使用される可能性がある
- 検索/インデックス:隠れた文字が検索結果やデータベースの検索に影響する
Unicode Inspectorでの検出
Unicode Inspectorはゼロ幅文字を何も表示しない代わりにコードポイントラベル(例:U+200B)で表示し、即座に可視化します。
実用的なヒント
- 比較前に
String.prototype.normalize()を使用してテキストを標準化する - 正規表現でゼロ幅文字を除去する:
/[\u200B-\u200D\uFEFF\u2060]/g - 文字列比較の失敗をデバッグする際に予期しないゼロ幅文字をチェックする
ユースケース
ユーザー送信テキスト内の不可視文字の問題のデバッグ、ステガノグラフィーや文字列操作攻撃の検出、隠れた文字を含むデータインポートのクリーニング、視覚的に同一の文字列が等価チェックに失敗する理由の理解に使用します。