ゼロ幅スペース
表示幅がゼロの不可視文字 (U+200B)。改行位置のヒントやテキスト処理の制御に使われる。
ゼロ幅スペース (Zero-Width Space, U+200B) は、表示幅がゼロの不可視文字です。画面上には何も表示されませんが、テキストデータ内に確かに存在し、1 文字としてカウントされます。主に改行可能位置のヒントとして機能し、ブラウザはこの文字の位置で行の折り返しを許可します。Unicode の「一般カテゴリ」では書式文字 (Cf) に分類されています。
ゼロ幅スペースが実務で重要になる場面はいくつかあります。タイ語やクメール語など、単語間にスペースを入れない言語では、ゼロ幅スペースが単語境界を示す役割を果たし、適切な位置での改行を可能にします。Web 開発では、長い URL やハッシュ値などスペースを含まない長い文字列の途中にゼロ幅スペースを挿入することで、レイアウトを崩さずに改行させるテクニックがあります。HTML では ​ または ​ で挿入できます。
ゼロ幅スペースに関連する不可視文字は他にもあります。ゼロ幅非結合子 (U+200C, ZWNJ) は結合を防ぐ文字で、ペルシア語やヒンディー語の表記で使われます。ゼロ幅結合子 (U+200D, ZWJ) は文字の結合を促す文字で、絵文字の ZWJ シーケンス (家族の絵文字など) に使われています。これらの不可視文字はすべて表示幅ゼロですが、テキスト処理においてはそれぞれ異なる意味を持ちます。
セキュリティの観点では、ゼロ幅スペースはフィンガープリンティング (テキストに不可視の識別子を埋め込む技術) に悪用されることがあります。機密文書にゼロ幅文字のパターンを埋め込み、流出元を特定するという手法です。一方で、ドメイン名にゼロ幅文字を混ぜて正規のドメインに見せかけるという説明には注意が必要です。ゼロ幅スペースのような不可視の文字は IDNA の規則でドメイン名に使えないと定められており (U+200B は使用不可)、主要なブラウザ側でも弾かれます。実際に警戒すべきなのは、画面に表示されるリンク文字列やメールの本文、フォームの入力値に混ぜて、単純な文字列一致による検査をすり抜けさせる使い方です。入力値のサニタイゼーションでは、ゼロ幅文字の除去も考慮に入れるべきです。
よくあるトラブルとして、コピー&ペーストでゼロ幅スペースが意図せず混入するケースがあります。Web ページからテキストをコピーした際にゼロ幅スペースが含まれていると、見た目は同じなのに文字列比較が失敗する、検索でヒットしない、パスワードが通らないといった問題が発生します。厄介なのは、一般的な空白除去では消えないことです。ゼロ幅スペースは Unicode の分類上は書式文字なので、正規表現の \s にマッチせず、JavaScript の trim() や Python の strip() でも残ります (Node.js 26 / Python 3 で実測)。除去するときは \u200B から \u200D と \uFEFF のように、対象のコードポイントを明示して指定してください。目で見て探せない文字なので、文字列比較が合わないのに違いが見当たらない時点でこの可能性を疑うのが早道です。
文字数カウントとの関連では、ゼロ幅スペースは表示されないにもかかわらず 1 文字としてカウントされるため、見た目の文字数と実際の文字数に差が生じる原因になります。たとえば「こんにちは」の間にゼロ幅スペースが 3 つ挿入されていると、見た目は 5 文字ですが実際は 8 文字です。提出先が字数を機械的に数える場面では、この差がそのまま超過や不足として扱われます。Web からコピーした原稿を字数の決まった欄に貼るときは、いったんプレーンテキストへ落として不可視文字を落としてから数えると、書き直しの手戻りを防げます。