不可見字元不一定是「空字元」。它可以標記詞語邊界、阻止斷行、連接字母形狀、選擇顯示樣式,甚至改變文字排列方向。
兩個看起來完全相同的字串,內部可能帶著不同指令。
「空格」其實有許多不同工作
U+0020 SPACE 是鍵盤上熟悉的空格。Unicode 還包含:
- U+00A0 NO-BREAK SPACE 有可見寬度,但不鼓勵斷行;
- U+2009 THIN SPACE 提供較窄的排版間隔;
- U+3000 IDEOGRAPHIC SPACE 占一個東亞全形字格;
- 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 可鼓勵連接,也連接 Emoji 序列;
- U+FE0E/U+FE0F 要求文字或 Emoji 顯示。
把它們都叫「隱形空格」會掩蓋不同任務,其中幾個根本不是空格。在需要上下文塑形的書寫系統中,連接符和非連接符也可能參與正確拼字;任意刪除會改變詞形或意思。
方向控制符解決真實的多語問題
阿拉伯文與希伯來文主要從右向左,拉丁字母與數字常從左向右。Unicode 雙向演算法決定混合文字如何顯示;方向標記、隔離、嵌入與覆寫協助軟體處理歧義。
這些控制符是多語文字的重要基礎設施。但邏輯儲存順序與視覺順序可能不同,處理不當也會讓畫面內容看似與程式實際處理的序列不一致。因此程式碼編輯器與安全工具特別注意異常的雙向控制符。
為何複製來的文字難以除錯?
不可見字元常來自格式化文件或網頁、輸入法與文字塑形、自動斷行、Emoji 序列,以及刻意製作空白暱稱。
症狀包括搜尋失敗、看似重複的使用者名稱、網址比較不相等、意外斷行,或游標像被卡住。正確診斷方式是查看碼位,而不是不斷按退格鍵。
隱藏字元與相似字元涉及安全
Unicode 支援世界各地的文字,因此不同字元可能共享相似字形。拉丁 a 和西里爾 а 並非同一字元,即使某種字型把它們畫得很像。
Unicode 技術標準 #39 定義偵測易混淆識別符的機制。目標是發現風險,而不是把所有文字粗暴轉成 ASCII。國際姓名混合文字可能完全合理;同樣組合出現在仿冒銀行網域中就值得警惕。
「不可感知 NLP 攻擊」研究也顯示,隱形插入、同形字替換、重排與刪除控制,可以在外觀幾乎不變時影響搜尋及語言系統。
安全與高風險用途
合理用途包括測試文字顯示、分析文件、處理斷行,以及在確實需要的書寫系統使用連接控制。
高風險用途包括偽裝連結或帳號、繞過審核、在原始碼插入控制符、違反服務規則製造空白身分,以及對讀者隱藏內容。即使只是裝飾,若螢幕閱讀器反覆朗讀「空白」或陌生字元名稱,也會傷害無障礙體驗。
產品應如何處理?
應用程式可以對異常格式控制符顯示警告,在適當情境比較正規化與易混淆骨架,保留合法多語文字,在診斷工具列出碼位,並把顯示名稱與安全敏感的帳號 ID 分開。
正規化、易混淆偵測與移除格式控制,解決的是不同問題。沒有一個適用所有語言與情境的「清理 Unicode」按鈕。
看不見不等於沒有意義;沒有字形,本身也可能是一條指令。
空白字元工具會標示各字元及預期行為。請用於測試與正當排版需求,而非偽裝文字或規避平台規則。