開發者工具·文字比較
看不見的差異:不間斷空格、智慧引號和 Unicode 形式
· 工作原理
文字差異 統一碼 偵錯
解釋了為什麼螢幕上看起來相同的行可能逐字節不同,從不間斷空格和大引號到零寬度字元和分解重音,以及如何找到它們。
兩行看起來相同,但被標記為已更改 - 打開時會顯示一個翻譯檔案,該檔案因無明顯原因而未通過審核
平移線可以與其相鄰線完全一樣地渲染,但仍然無法進行比較。瀏覽器字體隱藏代碼點邊界、組合重音符號並將相似的形狀分配給不同的標點符號。 ToolAcre 僅在選定的大小寫或空格轉換後比較 JavaScript 字串,因此標記的行可以暴露真正的文字差異。
相信位置,而不是關於角色的假設。將可疑行複製到顯示程式碼點的編輯器或十六進位檢查器中。 diff 告訴您哪一行不同;它不會註解內部位置或命名負責的 Unicode 值。
不間斷空格及其親屬 — 解釋 U+00A0 和文字處理器插入的其他空格字元以及為什麼普通空格與它們不匹配
U+00A0 不間斷空格與 U+0020 普通空格不是相同字元。在普通模式下,它們的線路鍵保持不同。在「忽略空白」下,空白執行替換可能會在修剪後將這些執行減少到普通空格,從而使一些此類差異消失。
此選項是匹配轉換,而不是 Unicode 清理命令。顯示的相等行保留原始左側文字,並不會產生更正的文件。如果發布系統需要不間斷的間距,則規範化匹配可能會隱藏有意的佈局指令而不是修復它。
空白模式可能會折疊 Unicode 空白;普通比較保留不同的字元
直撇號和引號與印刷的開頭和結尾形式不同。忽略大小寫不會更改標點符號,且空格處理不會重寫引號。因此,即使句子乍看之下完全相同,文字處理器的自動更正功能也可以產生全行替換。
根據目的地選擇所需的標點符號。原始碼、搜尋關鍵字和資料格式可能需要精確的 ASCII 字符,而編輯副本可能更喜歡印刷形式。比較證明了差異,但它沒有確定哪一方是正確的政策。
零寬度和方向字元 — 涵蓋零寬度空格、連接符號和雙向標記,這些標記呈現為無任何內容但仍會變更行
零寬度空格、連接符號和方向標記可以佔據字串位置,而無需繪製可見的字形。 ToolAcre 使用文字內容呈現輸入,避免 HTML 解釋,但安全性呈現不會使隱藏的程式碼點可見。他們仍然參與普通的排隊平等。
定向行為也會使視覺順序成為儲存順序的不可靠指南。不要僅僅因為可疑的混合方向片段看起來很熟悉而將其複製到 shell 命令或識別碼中。在替換任何內容之前,請在專用工具中檢查程式碼點和周圍上下文。
組合與分解重音 — 解釋 NFC 與 NFD 規範化(將重音字母作為一個代碼點與基本字母加組合標記)
重音字元可以表示為一個預組合代碼點或表示為後跟組合標記的基本字母。此儲存庫不包含對 `normalize` 的調用,因此規範等效的形式仍然是不同的 JavaScript 字串,並可以產生刪除加添加行。
測試套件證明相同的 Unicode 字串匹配,並 `café` 與 `cafe` 不同;它不承諾進行字素感知比較。因此,本文避免了有關位元組比較或完整 Unicode 等效性的宣告。線路演演算法接收字串並嚴格相等地比較它們轉換後的鍵。
組合重音和分解重音仍然不同,因為工具不執行 Unicode 標準化
假設资源行看起來未更改但已標記。首先與所有選項關闭进行比较,然後單独切換空白。如果行變得相等,則檢查空格和隐藏的空白。如果它仍然發生變化,请檢查引号,組合標記和其他代碼点,而不是重複重新鍵入该行。
字符檢查器可以顯示 U+00A0 應该是普通空間的位置。確認格式要求後才可進行替換。在翻譯內容中,不間斷空格可能是故意的標點符號約定,而廣泛的搜尋和替換可能會損壞其他地方的正確排版。
這不包括什么——行不同的比较报告;它不會為您执行 Unicode 规范化或替換字符
文字差异不會標准化 NFC 或 NFD、識別易混淆的內容、刪除零宽度標記或產生修複的輸出。它也不比較編碼位元組。這些是單独的操作,其後果是通用線路比较器不應该默默地選擇。
忽略大小寫使用 JavaScript `toLowerCase`,而忽略空白會修剪並壓縮相符的鍵。這兩種操作均不提供區域設定感知排序規則或 Unicode 安全審查。使用輸出來縮小調查範圍,而不是證明標識符是安全的或語言上等效的。
重點:相信您的眼睛所看到的差異 — 得出的結論是標記的行是真正的差異,並展示了 ToolAcre 的文字比較如何精確定位要檢查的行
當視線和差異不一致時,假設該字串值得檢查。該演算法沒有視覺模型,不會被字體整形所欺騙;它看到線路鍵。這種限制很有用,因為它可以防止隱藏的差異僅僅因為瀏覽器繪製相似而傳遞。
首先執行普通比较,記錄哪個選項更改了結果,並在編輯之前檢查代碼点。此證據線索將空白規範化與標點符號或組成分開,並避免了用 ASCII 近似值替換每個不尋常字元的破壞性習慣。