簡體   English   中英

如何使用GNU diff來區分utf-16文件?

[英]How do I diff utf-16 files with GNU diff?

GNU diff似乎不夠智能,無法檢測和處理UTF-16文件,這讓我感到驚訝。 我錯過了一個明顯的命令行選項嗎? 有沒有好的選擇?

vimdiff為此目的很好地工作。

我在閱讀StackOverflow答案時發現了它。

從GNU diff文檔:

處理多字節和變寬字符

diff,diff3和sdiff將每行輸入視為一串unibyte字符。 在某些情況下,這可能會錯誤處理多字節字符。 例如,當要求忽略空格時,diff不會正確忽略多字節空格字符。

此外,diff當前假設每個字節是一列寬,並且在某些語言環境中這種假設是不正確的,例如,使用UTF-8編碼的語言環境。 這會導致diff的-y或--side-by-side選項出現問題。

需要修復這些問題,而不會過度影響unibyte環境中的實用程序的性能。

IBM GNU / Linux技術中心國際化團隊提出了一些補丁來支持國際化的差異化http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch .gz 不幸的是,這些補丁是不完整的,並且是舊版本的差異,因此需要在這個領域做更多的工作。

我從來沒有意識到自己。

如果一個非自由的非命令行工具可以完成這項工作,看起來Guiffy可以勝任這項工作,仍然在尋找一個免費的命令行工具:

http://www.guiffy.com/Diff-Tool.html

安裝支持UTF-16的ripgrep實用程序 ,然后運行:

diff <(rg -N . file1.txt) <(rg -N . file2.txt)

ripgrep支持使用UTF-8以外的文本編碼搜索文件,例如UTF-16,latin-1,GBK,EUC-JP,Shift_JIS等。 (提供了一些自動檢測UTF-16的支持。必須使用-E / --encoding flag.專門指定其他文本編碼--encoding flag.

使用重音符號或特殊字符時變形補丁:

 diff --version
 diff (GNU diffutils) 3.6
 diff -Naur old_foo new_foo > foo.patch

無論比較文件/目錄是否在git文件夾中,都可以正確處理重音符號或特殊字符。

 git --version
 git version 2.17.1
 git diff --no-index old_foo new_foo > foo.patch

您可以使用優秀的chardet在python中構建一些東西,然后將您的文件轉換為UTF-8並將其發送到GNU diff?

http://chardet.feedparser.org/

在Python中,您可以使用difflib.HtmlDiff創建一個HTML表,該表顯示兩個行序列之間的差異,並且它似乎可以與Unicode字符串一起使用(當然,前提是您使用適當的編解碼器讀取和寫入它們)。

>>> hd = difflib.HtmlDiff()
>>> htmldiff = hd.make_file(codecs.open('file1', 'r', 'utf-16').readlines(), codecs.open('file2', 'r', 'utf-16').readlines())
>>> print >> codecs.open('diff.html', 'w', 'utf-16'), htmldiff

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM