見えない文字は、空の文字とは限りません。単語の境界を示す、改行を防ぐ、字形を接続する、表示方法を選ぶ、文字の表示方向を変えるなどの指示を持てます。
見た目が同じ2つの文字列に、異なる命令が入っていることがあります。
「空白」には別々の仕事がある
U+0020 SPACEはキーボードの空白です。Unicodeにはほかにも次の空白に見える文字があります。
- U+00A0 NO-BREAK SPACE:幅はあるが改行を防ぐ
- U+2009 THIN SPACE:狭い組版用の間隔
- U+3000 IDEOGRAPHIC SPACE:東アジアの全角1字分
- U+2800 BRAILLE PATTERN BLANK:点のない点字文字であり、汎用空白ではない
幅、改行、意味、アクセシビリティはそれぞれ違います。サービスがある空白を拒否したからといって、別の「空白に見える文字」で置き換えると予想外のレイアウトになります。
ゼロ幅でも指示を持てる
- U+200B ZERO WIDTH SPACE:見える隙間を作らず改行候補を置く
- U+2060 WORD JOINER:幅を増やさず改行を防ぐ
- U+200C ZERO WIDTH NON-JOINER:筆記体の接続や合字を抑える
- U+200D ZERO WIDTH JOINER:接続を促し、絵文字シーケンスも結ぶ
- U+FE0E/U+FE0F:テキスト表示または絵文字表示を指定する
すべてを「見えない空白」と呼ぶと役割の違いが消えます。そもそも空白でない文字もあります。文脈に応じて字形が変わる文字体系では、接合子と非接合子が正しい綴りに関わるため、無差別に削除できません。
方向制御は多言語の実問題を解く
アラビア文字とヘブライ文字は主に右から左へ、ラテン文字や数字は左から右へ進みます。Unicode双方向アルゴリズムが混在テキストを配置し、方向記号、分離、埋め込み、上書き制御が曖昧な場面を補います。
これは多言語表示に欠かせない仕組みです。しかし保存順と表示順が異なるため、扱いを誤ると、プログラムが処理する列と画面上の読め方が変わります。コードエディタやセキュリティ製品が不自然な方向制御を警告するのはこのためです。
コピーした文字が調べにくい理由
見えない文字は、整形済み文書やWebページ、入力方式、文字の字形処理、自動改行、絵文字シーケンス、空白名を作る操作などから入ります。
検索に出ない、同じに見えるユーザー名が重複する、URLが一致しない、予想外に改行する、カーソルが止まったように見える、といった症状が起きます。正しい診断方法は、Backspaceを繰り返すことではなくコードポイントを見ることです。
見えない文字と似た文字はセキュリティにも関わる
Unicodeは世界の文字を支えるため、別の文字が似たグリフを持つことがあります。ラテン文字の a とキリル文字の а は、見た目が近くても別の文字です。
Unicode Technical Standard #39は、紛らわしい識別子を検出する仕組みを定めています。目的はすべてをASCIIにすることではなく、文脈に応じて危険を見つけることです。国際的な人名での文字混在は正当でも、銀行を装うドメインなら疑う必要があります。
見えない挿入、同形文字、並べ替えが検索や言語処理の結果を変える「知覚できない攻撃」も研究されています。
安全な用途と危険な用途
表示テスト、文書解析、改行処理、必要な文字体系での接合制御は正当な用途です。一方、リンクやアカウントの偽装、モデレーション回避、ソースコードへの制御文字挿入、禁止された空白名の作成は危険です。
製品側は予期しない書式制御を警告し、必要に応じて正規化や紛らわしい形を比較し、正当な多言語文字を保護し、診断画面でコードポイントを示すべきです。
見えないことは、意味がないことではありません。グリフがないこと自体が指示になり得ます。
空白文字コピペは各文字の用途を表示します。テストと正当なレイアウトに使い、偽装や規約回避には使わないでください。