Zalgo 文字看起來像字型逃出了行框:
Z̴̡̛̫̹̿a̵̡̳̋l̴̙̓g̶̤̈o̷̜̽
它不是圖片,通常也不是字型損壞;效果來自在一般基本字元後加入大量組合附加符。
組合附加符在做什麼?
許多書寫系統需要重音、母音符號、聲調與其他和相鄰字元有關的記號。Unicode 把其中許多編碼成不占間距的組合字元。
é 可以表示為:
- 單一預組字元 U+00E9 LATIN SMALL LETTER E WITH ACUTE;
- 或 U+0065 LATIN SMALL LETTER E,後接 U+0301 COMBINING ACUTE ACCENT。
第二個碼位修飾第一個。排版系統把重音放到基本字母上方,卻不讓游標再前進一般字元的寬度。
Zalgo 產生器利用同一機制,只是在每個字母上方、下方與中間加入遠超正常拼寫需求的附加符。
為何能堆得如此誇張?
組合字元具有規範組合類別,協助決定附加符在基本字元周圍的順序。字型也會為常見組合提供定位錨點。當序列極長或罕見時,排版系統只能盡力處理。
一種字型可能疊得整齊;另一種可能讓符號碰撞、蓋住鄰近行,或伸出按鈕邊界。文字序列仍然有效,只是介面未曾為一個字母掛上幾十個重音而設計。
這也解釋了效果為何會隨瀏覽器與作業系統變化。Unicode 規定字元與屬性,字型決定形狀和附著位置。
正規化不等於「刪除重音」
Unicode 正規化讓等價序列更容易比較。NFC 在有預組字元時合成基本字母與附加符;NFD 則拆解許多預組字元。兩者也會把組合符調整到規範順序。
但它們都不是 Zalgo 清理器。多數極端組合沒有預組等價字元,正規化後附加符仍是有意義的編碼字元。
產品若要提供「純文字」功能,必須另外判斷哪些符號屬於語言、哪些只是裝飾。粗暴移除所有組合符,會破壞越南文、阿拉伯文、希伯來文、印度文字等許多正常語言。
一個可見字母可以含有許多碼位
Unicode 文字分段通常把基本字元與後續組合符放進同一個延伸字素叢集,因此即使 é 由兩個碼位編碼,游標仍可把它視為一個單位。
Zalgo 把這條規則推到極端:一個看似單一字母的單位,可能有十個、二十個甚至更多碼位。這會影響資料庫長度限制、訊息截斷、游標與選取、行高、搜尋、審核和螢幕閱讀器。
使用者看到的長度,不等於電腦儲存的長度。
裝飾效果背後是重要基礎設施
組合附加符不是「壞字元」,而是數位書寫不可缺少的一部分。故障效果之所以成立,正因 Unicode 與現代塑形系統支援複雜文字。
風險來自情境與數量。龐大的堆疊會讓介面難讀、製造異常行高,也可能隱藏自動系統仍會處理的差異。Unicode 隱形擾動研究也顯示,隱形字元、同形字與重排可能干擾語言處理。
怎樣使用才不容易破壞版面?
- 效果只用於短標題或單字。
- 使用低至中等強度。
- 在目標 App 預覽。
- 內容重要時附上一般文字版本。
- 避免帳號、連結、Email 與安全資訊。
產品介面應同時限制碼位與字素叢集數量、處理溢出,並測試異常長的組合序列。「看起來短」不表示儲存與顯示成本低。
Zalgo 是靠累積產生的排版:基本字母保持普通,真實的 Unicode 附加符卻堆出不普通的形狀。
故障文字產生器可以控制附加符數量。建議先從輕度開始,再用上方顯微鏡檢查。