WinMerge:如何比较具有相同内容但编码不同的文件?

时间:2013-01-09 12:44:51

标签: winmerge

动机:我正在重写一个文档 - 稍后要处理的文本文件。新的来源现在使用UTF-8。大部分来源是相同的。我需要找到差异。

详细信息:旧的doc源使用cp1250编码,新的源使用UTF-8。新旧源都使用相同的行结尾(CR + LF)。我正在使用Unicode版本的WinMerge应用程序(WinMergeU.exe),版本2.12.4.0。

它几乎可以工作,但是......当线条不同时,它们最初被暗黄色标记为块,并且使用较浅的颜色标记不同的部分。当在那里移动红色块光标时,下面的窗格显示不同的部分。

但是,在文本(的Unicode表示)相同的情况下,文本块也用深黄色标记。红色块也移动到文件的那些部分。在这种情况下,下面的两个窗格(显示差异)包含相同的文本,没有任何标记为不同。见下图:

Example of the line that should not differ.

第一行不同 - 这没关系。但第二行在视觉上具有相同的内容。 ASCII范围之外的唯一字符是Ú。它在编码源中具有不同的表示。这会导致标记为不同的行,但下面的窗格不会将该行标记为不同。

另请参阅以下完全相同的段落(仅源中的编码不同,使用相同的行结尾)。

看起来好像初始比较是基于线的二进制表示。是否有任何设置告诉WinMerge比较(我的意思是块标记)应该基于Unicode内容?

我努力了,但没有运气,但是。

更新:上述问题针对的是最新稳定的2.12.4。测试版2.13.22非常适合我。请参阅my answer below

6 个答案:

答案 0 :(得分:10)

这并没有真正回答你关于WinMerge的问题,但是你考虑过使用另一个差异程序吗?我最喜欢的一个是kdiff - http://kdiff3.sourceforge.net/

当我使用一个UTF8文件和另一个Unicode文件对KDiff进行比较时,我得到以下结果:KDiff Compare Warning

这是比较屏幕 - 请注意文件上的编码是不同的,但从文本的角度来看,文件被认为是相同的:

KDiff Compare Results

答案 1 :(得分:8)

我认为合并工具的任务不应该是允许合并存储在不同编码中的文件。

编码是将字节(存储在磁盘或内存中)映射到字符(显示在屏幕上)的函数。不幸的是,默认情况下,文件的编码不与文件一起存储。因此,任何想要打开文件并显示其内容的程序都需要猜测编码。虽然这有时会起作用,但它也是一个容易出错的过程。

现在,不同编码的字符集一般不重叠。那么,如果将编码X中的文件A中的字符C合并到编码Y中的文件B中,如果字符C不是编码Y的字符集的一部分,那么合并工具应该做什么?

因此,我认为合并工具的任务应该是合并二进制内容。任何其他东西都是肮脏的黑客,并且在某种程度上会失败。 (合并工具制造商可能决定提供字符级别合并,这也可能在大多数情况下都有效。但是需要进行一些猜测。)

因此,我还建议您先将旧文件翻译成UTF-8,然后将这些文件与新版本合并。

答案 2 :(得分:4)

仅供参考。问题是最新的稳定2.12.4。我已经尝试过测试版2.13.22,它对我来说非常合适。查看完全相同文件的差异 - 仅删除文件中的第一行。 (我非常感谢作者。)

enter image description here

答案 3 :(得分:2)

  1. 编辑->选项
  2. 从左侧的类别窗格中选择“比较”。
  3. 复选框“忽略回车差异”(UNIX,Windows,Mac)

答案 4 :(得分:1)

我建议在传播之前将文件转换为相同的编码。

如果您正在使用版本控制系统,我建议您使用以下内容:

  1. 创建新的文件签出
  2. 将所有文件转换为UTF-8
  3. 提交文件
  4. 通过
  5. 复制新文件
  6. 使用WinMerge
  7. 这样你最终会在历史记录中进行两次提交 - 一次用于编码更改,另一次用于内容更改,WinMerge将按预期工作。

答案 5 :(得分:0)

WinMerge中的选项File -> File Encoding...怎么样?它允许独立设置文件的编码。