Text Diff Checker 會在瀏覽器中逐行比對兩段文字版本,並使用確定性的最長共同子序列演算法,將每一列標記為新增、刪除或未變更。若要在 Notepad++ 中執行 Compare 外掛平時處理的相同工作,請將原始文字貼在左側、修改後的文字貼在右側,然後選擇 Compare lines。工具接著會回傳一份單一的有序清單,新增的內容以加號開頭、刪除的內容以減號開頭、未變更的列則帶有中性前置符號。最上方會顯示摘要,列出新增、刪除與未變更的行數;兩段文字都停留在瀏覽器分頁內,絕不會上傳;而且結果是可重現的:相同的輸入永遠會產生相同的列。每一側最多 500 行或 200,000 個 UTF-16 程式碼單位,以先達到的限制為準,超出限制的一側會在任何比對執行前就被拒絕,因此不會發生默默截斷的情況。任一側為空輸入時會視為零行,即使兩段文字各達到數萬個字元,比對過程仍會在本地端完成。

how to check text difference in notepad ++
how to check text difference in notepad ++

為何 Notepad++ 使用者會選擇在瀏覽器端進行差異比對

Notepad++ 透過其 Compare 外掛處理文字差異,會在並排的緩衝區中以顏色標示新增、刪除與變更的行。該外掛透過「Plugins → Plugins Admin」安裝,並從「Plugins」選單呼叫,因此會停留在 Notepad++ 處理程序內。當兩個檔案都已在 Notepad++ 中開啟、且允許載入該外掛時,此工作流程運作良好,但有幾種情況會讓使用者傾向改用瀏覽器端的方法。

在受管制的機器上可能無法安裝外掛,或者您要比較的文字可能位於剪貼體中而非儲存的文件。有時候目的是要與未安裝 Notepad++ 的同事快速分享視覺化的差異比對,或是要檢視兩段散文版本,此時單行變更的色彩標示比乾淨的加號或減號清單更難快速瀏覽。瀏覽器工具也能避開編碼不符的陷阱——當一個緩衝區是 UTF-8、另一個是 Windows-1252 時有時會發生這種情況——因為貼上的文字會以螢幕上顯示的字面字元來處理,而不是從磁碟上的檔案重新解碼。針對這些情況,Text Diff Checker 提供 Notepad++ 使用者所熟悉的相同加號或減號檢視,而且不需要安裝外掛或額外的處理程序。

執行逐行比對

  1. 將原始文字貼入左側面板,將修改後的文字貼入右側面板。
  2. 選擇 Compare lines。
  3. 檢視新增的加號、刪除的減號、未變更的列,以及頂端的摘要計數。

在您按下按鈕之前,上述每個步驟都有一些值得了解的細節。兩個面板接受貼上的區塊。請一次貼上整個區塊,這樣兩側的行邊界才能保持對齊:部分貼上會與另一側剛好存在的內容進行比對,而這通常不是您想要的結果。兩側都填入內容後,請選擇 Compare lines。按鈕會先檢查大小:若任一側超過 500 行或 200,000 個 UTF-16 程式碼單位,比對就不會啟動。若輸入通過檢查,便會建立最長共同子序列表格,並將結果呈現為單一的有序清單。若要比較不同的配對,請編輯任一側:一旦文字變更,先前的比對結果就會立即清除,因此您看到的數字永遠反映可見的列。

解讀加號、減號與中性列

輸出是單一的有序清單,而不是兩個並排的緩衝區。每一列都帶有一個標記,告訴您該行的來源:加號代表該行僅出現在修改後的版本中,減號代表該行僅出現在原始版本中,中性標記則代表該行在兩者中相符。清單上方有一個摘要,報告新增列的數量、刪除列的數量,以及未變更列的數量。這些計數衍生自清單中可見的相同列型別,因此總計與視覺呈現不會出現不同步的情形。

標記意義來源面板
+ 加號該行僅出現在修改後的文字中右側
- 減號該行僅出現在原始文字中左側
中性該行在兩個版本中完全相符兩者皆是

由於相同的行內容可能出現在兩側但並未被標記為中性,因此請記住此處的「未變更」代表該列是由演算法選入最長共同子序列。摘要計數與可見的前置符號永遠一致,因為兩者都是根據同一份最終列清單計算而成。

什麼算是未變更的行

本工具中的行相等性是指精確的字串相等性。這包含大小寫、每個標點字元、每個前導空白、每個尾端空白、每個定位字元,以及行內的每個 Unicode 程式碼點。因此,將逗號改成分號、將單個字母改為小寫,或附加一個空格等單一字元編輯,會顯示為一個刪除列與一個新增列,而不是同一位置的醒目變更。比較的單位是完整的行,而不是字元或單字。

CRLF、獨立的 CR 與 LF 都會被識別為行邊界。CRLF 會被視為一個邊界,而非兩個。在分析過程中,比對會統一邊界語法,同時完整保留每行內部的貼上內容,因此以 Windows 儲存的原始檔案與以 Unix 儲存的修改版本,只要內容行相同仍會相符,而不會將行尾本身標記為差異。

這種粗略的檢視是刻意的。它在清單、設定片段、散文段落與小型程式碼摘錄上仍易於理解。若單一列顯示出有意義的差異,則需要由您在真正的編輯器中並排檢查該列的內容並套用變更。

空輸入、空行與重複的行

任一側完全為空的輸入會被視為零行,工具會將非空的一側與空陣列進行比對:非空側的每一行會根據哪個面板為空,而顯示為新增或刪除。非空文字內部的空行是有效的行值,並會像其他行一樣參與比對,因此若兩個版本中都存在某個空行,會顯示為未變更;若某個空行被插入或刪除,則會顯示為加號或減號列。

重複的行可能產生多個有效的最佳對齊方式,因為相同的行可以在多個位置進行配對。實作採用確定性的平手規則,在剩餘子序列長度相等時偏好新增,因此相同的輸入永遠會產生相同的列。此檢視是說明性的差異顯示,而不是修補檔產生器:它不包含行號、不包含字元層級的醒目提示、不進行空白或大小寫摺疊、不偵測移動區塊,也沒有沒有合併衝突標記。若您需要可使用 patch 套用的 unified-diff 檔案,這並不是合適的輸出。

大小限制以及當一側過大時會發生什麼情況

每一側的上限為 500 行與 200,000 個 UTF-16 程式碼單位。最長共同子序列比對的行數運算量為二次方,因此明確的上限能讓一般分頁中的瀏覽器記憶體與延遲受到控制。字元限制同時約束了輸入儲存與呈現。若任一側超過上限,比對就不會啟動,也不會默默截斷任何內容。超出限制的一側會在動態規劃表格建立之前就被拒絕,您可以縮短輸入後再重試。

對於超過上限的文字,實際的做法是在貼上前將檔案分割成可預期的區塊,或使用不需要同時將兩個檔案保存在記憶體中的串流或原生 diff 工具。Notepad++ 使用者可以在編輯器中依照 本篇 Notepad++ 依行數分割指南 所述的工作流程準備區塊,然後將每個區塊依序貼入瀏覽器工具並依序讀取局部差異。即使輸入很大,所有處理仍在當前分頁中完成,因此兩個版本都不會離開瀏覽器。

何時瀏覽器差異工具是錯誤的選擇

在這個工具的規則下,顯示為相等代表的是其文件化比對下的精確字串相等,而非語意等價。不同的 Unicode 正規化形式、視覺相似的字元、隱藏的定位字元或不斷行空格字符、或跳脫字串內部的行尾慣例,都可能會以螢幕上看起來相同的變化呈現。請在任何會影響敏感下游格式的變更上,以該目的格式進行檢查,並保留原始版本直到檢視完成。

對於原始碼儲存庫而言,Git 會以本檢視無法做到的方式追蹤歷史、檔案名稱、重新命名、修補檔、作者與衝突解決。對於非常大的檔案,串流或原生 diff 工具才是合適的選擇,因為將多 MB 的檔案貼入瀏覽器會超過行數或字元上限。輸出是說明性的檢視,而非適合自動套用的檔案,因此請勿將其用於期待 unified-diff 語法的修補流程中。

若您正在權衡選項,Compare Two Lists for Duplicates Without Uploading 有詳細說明。