文字會依 Unicode 碼位切分,而不是 UTF-16 單位,因此 emoji 與增補平面字元不會被切成兩半。每個碼位對照一份精選的問題字元集比對——零寬與雙向格式控制字元、BOM、非 ASCII 空白、C0 與 C1 控制字元,以及模仿拉丁字母的西里爾與希臘字母。整段文字另外檢查換行是否混用,以及是否為 NFC 以外的正規化形式。
CSV 匯入卡在第一欄。貼進設定檔的 API key 怎麼樣都驗不過。兩組密碼看起來一樣,其中一組卻被拒絕。git diff 把每一行都標成有改動。正規表示式匹配不到明明就在那裡的字。這些情況的共同點是——文字不是它看起來的樣子,而任何以「看」為前提的工具都幫不上忙。
全程在你的瀏覽器內執行。貼上的文字不會送到伺服器、不會寫進任何儲存空間、也不會進入分析事件。這件事在這裡特別重要——會被拿來檢查的字串,往往就是 API key、token 與密碼。
關於這個主題的常見疑問與實用解答。
把文字貼進左邊面板。結果區上方的旗標會告訴你找到幾類問題,點旗標會跳到第一個出現的位置。下方的逐字元檢視把每個可疑碼位標成可點的標記,點下去就會說明它是什麼、該怎麼處理。
它是一個格式控制字元,畫出來完全沒有寬度,原本的用途是提供斷行機會。對人來說它不存在;對程式來說它就是字串裡多出來的一個碼位。所以中間夾了零寬空白的電子郵件或 API key,在畫面上看起來完全正確,卻永遠對不上資料庫裡的值。
實務上反覆出現的有五個:U+200B 零寬空白與同族字元、從網頁複製帶進來的 U+00A0 不斷行空白、檔案開頭的 U+FEFF BOM、中日韓輸入法產生的 U+3000 全形空白,以及模仿拉丁字母的西里爾與希臘字母。本工具會逐一標出,另外也標 C0 / C1 控制字元與 thin space 之類的排版空白。
一般空白是 U+0020,也就是你按空白鍵打出來的那個。不斷行空白是 U+00A0——外觀相同,但它告訴排版引擎不要在這裡斷行,最常在複製網頁內容時被帶進來。全形空白是 U+3000,明顯比較寬,由中日韓輸入法產生。三者畫出來都是空白,但只有 U+0020 會被 ASCII 空白的樣式匹配到,所以另外兩個會靜默弄壞 trim、split 與欄位切分。
原因有兩個,彼此獨立。第一個是其中一段夾了看不見的字元——零寬空白、不斷行空白或 BOM。第二個是 Unicode 正規化:字母 é 可以是單一碼位(NFC),也可以是字母 e 加上一個組合重音(NFD)。兩者畫出來一模一樣,但序列不同,逐位元組比對就會失敗。macOS 檔名與部分輸入法產出 NFD,所以文字在系統之間搬動時可能靜默換了形式。本工具兩種原因都會標出。
它檢查一組已知會出事的字元——零寬與雙向格式控制字元、BOM、非 ASCII 空白、C0 / C1 控制字元,以及西里爾與希臘同形字——再加上整段的換行混用與非 NFC 正規化。它不會改動你的輸入、不上傳任何內容,也不是完整的 Unicode linter:這份精選集以外的罕見或特定書寫系統問題不會被標出。「複製清理後文字」是輔助功能,不是主要結果;主要結果是診斷本身。