ゼロ幅スペース

表示幅がゼロの不可視文字 (U+200B)。改行位置のヒントやテキスト処理の制御に使われる。

ゼロ幅スペース (Zero-Width Space, U+200B) は、表示幅がゼロの不可視文字です。画面上には何も表示されませんが、テキストデータ内に確かに存在し、1 文字としてカウントされます。主に改行可能位置のヒントとして機能し、ブラウザはこの文字の位置で行の折り返しを許可します。Unicode の「一般カテゴリ」では書式文字 (Cf) に分類されています。

ゼロ幅スペースが実務で重要になる場面はいくつかあります。タイ語やクメール語など、単語間にスペースを入れない言語では、ゼロ幅スペースが単語境界を示す役割を果たし、適切な位置での改行を可能にします。Web 開発では、長い URL やハッシュ値などスペースを含まない長い文字列の途中にゼロ幅スペースを挿入することで、レイアウトを崩さずに改行させるテクニックがあります。HTML では ​ または ​ で挿入できます。Unicode 詳解の書籍で不可視文字の仕組みを学べます。

ゼロ幅スペースに関連する不可視文字は他にもあります。ゼロ幅非結合子 (U+200C, ZWNJ) は結合を防ぐ文字で、ペルシア語やヒンディー語の表記で使われます。ゼロ幅結合子 (U+200D, ZWJ) は文字の結合を促す文字で、絵文字の ZWJ シーケンス (家族の絵文字など) に使われています。これらの不可視文字はすべて表示幅ゼロですが、テキスト処理においてはそれぞれ異なる意味を持ちます。

セキュリティの観点では、ゼロ幅スペースはフィンガープリンティング (テキストに不可視の識別子を埋め込む技術) に悪用されることがあります。機密文書にゼロ幅文字のパターンを埋め込み、流出元を特定するという手法です。また、フィッシング攻撃でドメイン名にゼロ幅文字を挿入して正規のドメインに見せかける手口も報告されています。入力値のサニタイゼーションでは、ゼロ幅文字の除去も考慮に入れるべきです。

よくあるトラブルとして、コピー&ペーストでゼロ幅スペースが意図せず混入するケースがあります。Web ページからテキストをコピーした際にゼロ幅スペースが含まれていると、見た目は同じなのに文字列比較が失敗する、検索でヒットしない、パスワードが通らないといった問題が発生します。デバッグが困難なため、テキスト処理の前処理としてゼロ幅文字を除去するステップを入れることが推奨されます。

文字数カウントとの関連では、ゼロ幅スペースは表示されないにもかかわらず 1 文字としてカウントされるため、見た目の文字数と実際の文字数に差が生じる原因になります。たとえば「こんにちは」の間にゼロ幅スペースが 3 つ挿入されていると、見た目は 5 文字ですが実際は 8 文字です。文字数カウントツールでは、不可視文字の存在を検出してユーザーに警告する機能があると、このような問題の早期発見に役立ちます。文字コード基礎の書籍も参考になります。