GNU diff 似乎不够聪明,无法检测和处理 UTF-16 文件,这让我感到惊讶。我错过了一个明显的命令行选项吗?有没有好的选择?
6 回答
vimdiff
为此目的工作得很好。
我在阅读这个 StackOverflow 答案时发现了它。
来自 GNU 差异文档:
处理多字节和可变宽度字符
diff、diff3 和 sdiff 将每一行输入视为一串单字节字符。在某些情况下,这可能会错误处理多字节字符。例如,当要求忽略空格时,diff 不会正确忽略多字节空格字符。
此外,diff 目前假设每个字节为一列宽,并且这种假设在某些语言环境中是不正确的,例如,使用 UTF-8 编码的语言环境。这会导致 diff 的 -y 或 --side-by-side 选项出现问题。
这些问题需要在不过度影响单字节环境中实用程序的性能的情况下进行修复。
IBM GNU/Linux 技术中心国际化团队提出了一些补丁来支持国际化差异 http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch .gz _ 不幸的是,这些补丁是不完整的,并且是针对较旧版本的 diff,因此需要在这方面做更多的工作。
我自己从来没有意识到这一点。
如果非免费的非命令行工具可以完成这项工作,Guiffy 似乎可以胜任这项工作,但仍在寻找免费的命令行工具:
安装支持 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.
)
使用重音符号或特殊字符时的错误补丁:
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 ?
在 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