將 html 文件辨識為二進製文件的差異
我可能在這裡遺漏了一些資訊,但是今天當我嘗試
diff
在兩個.html
應該有細微差別的文件上執行並收到以下消息時,我感到很驚訝:$ diff index.html index3.html Binary files index.html and index3.html differ
為什麼
.html
文件被視為二進製文件?有沒有辦法避免這種情況並將它們視為文本文件?
如果前幾千字節中有空字節,GNU diff將文件視為二進製文件。文本文件不包含空字節,而二進製文件很可能在前幾百個字節內包含空字節,因此這是一個很好的啟發式方法。文件名無所謂。
diff 不顯示二進製文件之間差異的原因是這通常是不可讀的。二進制格式通常不能分成在塊發生變化後提供有用的重新對齊的行,通常會從根本上改變為小的語義變化(例如在壓縮文件中插入一個字元可以改變後面的所有內容),並且會導致無法列印diff 輸出中的字元。但是 diff 可以使用空字節。要強制 diff 將文件視為文本(意思是:顯示差異),請傳遞
--text
(or-a
) 選項:diff --text index.html index3.html
這是否有用取決於文件為什麼包含空字節。空字節在 HTML 文件中是不常見的。你可以得到一個提示
file index.html
如果文件實際上是壓縮的,diff 不會顯示任何有用的資訊:您需要解壓縮它,並且應該給它一個反映壓縮機制的名稱,例如
index.html.gz
. 如果您有壓縮文件,在 bash/ksh/zsh 中,您可以即時解壓縮它們(替換uncompress
為從標準輸入讀取壓縮文件並將解壓縮文本寫入標準輸出的實際命令):diff --label=index.html <(uncompress <index.html) --label=index3.html <(uncompress <index3.html)
您的文件可能以非基於 ASCII 的編碼進行編碼,例如UTF-16、UCS-2、UTF-32或 pre-Unicode 多字節編碼。這種編碼在網路上很少見。Web 瀏覽器確實支持它們,但文件製作工具可能會遇到問題。如果是這種情況,如果您修改生產鏈以使用UTF-8代替,您將省去麻煩。同時,
diff --text
將給出可能或可能不可讀的結果,具體取決於存在的非 ASCII 內容,或者您可以動態轉換文件以將它們傳遞給 diff,例如使用 little-endian UTF- 編碼的文件16:diff --label=index.html <(iconv -f UTF-16LE -t UTF-8 <index.html) --label=index3.html <(iconv -f UTF-16LE -t UTF-8 <index3.html)