如何使用GNU diff来区分utf-16文件?

时间:2009-04-22 17:15:41

标签: unicode diff gnu

GNU diff似乎不够智能,无法检测和处理UTF-16文件,这让我感到惊讶。我错过了一个明显的命令行选项吗?有没有好的选择?

6 个答案:

答案 0 :(得分:11)

vimdiff非常适合这个目的。

我在阅读this StackOverflow answer时找到了它。

答案 1 :(得分:8)

来自GNU diff文档:

  

处理多字节和变化宽度   字符

     

diff,diff3和sdiff处理每一行   输入作为unibyte字符串   字符。这可能是错误的   在某些情况下多字节字符。   例如,当被要求忽略时   空格,差异不正确地忽略   多字节空格字符。

     

此外,diff目前假定每个   byte是一列宽,这个   某些人的假设不正确   locales,例如,使用UTF-8的语言环境   编码。这会导致问题   -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

答案 2 :(得分:1)

安装支持UTF-16的https://help.shopify.com/en/api/reference/customers/customer#create,然后运行:

ripgrep
  

-E支持以UTF-8以外的文本编码搜索文件,例如UTF-16,latin-1,GBK,EUC-JP,Shift_JIS等。 (提供了一些对自动检测UTF-16的支持。必须使用--encoding flag. / {{1}}特别指定其他文本编码)

答案 3 :(得分:1)

当使用重音符号或特殊字符

Malforms补丁:

 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

答案 4 :(得分:0)

您可以使用优秀的chardet在python中构建一些东西,然后将您的文件转换为UTF-8并将其发送到GNU diff?

http://chardet.feedparser.org/

答案 5 :(得分:0)

在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