關於這個工具
文字裡可以藏著在螢幕上完全不佔位置、卻會改變意思的字元:一個零寬空白讓搜尋對不到,一個由右到左的覆寫字元讓程式碼看起來跟編譯出來的不一樣,一串 Unicode 標籤字元拼出一句只有語言模型讀得到的指令,或是英文單字裡混進一個西里爾字母的 а,連結就跑到別的地方去了。把文字貼進來,或丟一個最大 20 MiB 的文字檔(編碼自動判斷),所有可疑的字元會在原位顯示成 ZWSP、RLO、TAG a 這樣的標記,附上 code point、Unicode 名稱和分類。不上傳,分析全在這個分頁裡做。
會標出哪些
雙向控制字元——U+202A 到 U+202E、U+2066 到 U+2069,以及 LRM、RLM、ALM——這是 Trojan Source 攻擊的手法,審閱者在螢幕上看到的程式碼,跟編譯器讀到的不是同一份。零寬字元:U+200B ZWSP、U+200C ZWNJ、U+200D ZWJ、U+2060 WJ、U+FEFF。Unicode 標籤字元 U+E0000 到 U+E007F,會解回它藏的 ASCII——這是把指令偷渡給 LLM 做 prompt injection 的已知手法。不尋常的空格:NBSP、thin/narrow space、全形空格 U+3000。變體選擇器,一連串出現時可能夾帶隱藏資料。其他格式字元像軟連字號、控制字元、私人使用區的 code point。同形字:混進英文單字裡的西里爾或希臘字母——例如用西里爾的 р 和 а 拼出來的 paypal——用 Unicode UTS #39 的 confusables 資料找出混合文字系統的單字。三種模式(一般文字、程式碼、網址或帳號)只改變顯示的嚴重度,不改變偵測內容。
哪些會被認定是正常用法
不是每個零寬字元都是攻擊。emoji 的 ZWJ 序列(家庭、職業那些 emoji)、國旗的標籤序列、emoji 呈現選擇器、波斯文與印度系文字裡的 ZWNJ 和 ZWJ、中日文裡的全形空格、檔案開頭的 BOM,這些都顯示成資訊而不是警告。「清除」預設刪掉 Bidi、標籤和零寬字元,但會放過上面這些正常用法;同形字只會替換你逐字確認過的單字,因為希臘文句子裡的希臘文單字不是假的。結果可以複製,也可以下載成檔案。
它的限制
找到這些字元,不代表文字是 AI 寫的;沒找到,也不代表不是。網路上很多「ChatGPT 浮水印字元」的說法,其實是普通的排版——不斷行空格、窄空格、長破折號——文書軟體和網頁幾十年來本來就會塞這些進去。同形字檢查只看混合文字系統:整個單字都用西里爾字母拼的,對它來說就是一個正常的西里爾文單字。正常用法的判斷兩個方向都可能出錯。而字型層面的混淆,像某些字型裡小寫 l 和大寫 I 長得一模一樣,那不是 Unicode 的問題,這裡偵測不到。