【问题标题】:WinMerge: How to compare files with the same content but different encodings?WinMerge:如何比较具有相同内容但不同编码的文件?
【发布时间】:2020-02-14 17:37:33
【问题描述】:

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

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

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

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

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

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

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

我很努力,但还是没有运气。

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

【问题讨论】:

    标签: winmerge


    【解决方案1】:

    这并不能真正回答您关于 WinMerge 的问题,但是您是否考虑过使用另一个差异程序?我的最爱之一是 kdiff - http://kdiff3.sourceforge.net/

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

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

    【讨论】:

    • +1 谢谢。但我希望比我更了解 winmerge 的人会看到并告诉:嘿,你发现了一个错误!嗯,这里隐藏着一个神奇的选项。这是因为这是一个反例......我们在这个问题上思考了很多。 :)
    【解决方案2】:

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

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

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

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

    因此,我还建议您先将旧文件转换为 UTF-8,然后将其与新版本合并。

    【讨论】:

    • 嗯,这取决于。对我来说,比较文本文件内容的能力就是比较其内容的能力。 winmerge 正确识别内容并正确显示。我希望至少有一些选项来决定是否以二进制模式比较文本文件。
    • 正如我所说,在字符级别比较文件并不是一个防故障程序。这就是为什么许多 difftools 不支持它并且 kdiff 发出响亮的警告。这也不是一件容易的事,这可能就是 winmerge 不能优雅地处理这种情况的原因。也许将所有旧文件转换为 UTF-8 似乎很乏味,但这绝对是解决您问题的正确方法。 (特别是,解决方案与您使用的 difftool 无关。)
    • 我的观察是 WinMerge 在比较文本时工作得很好。它确实找到了具有不同编码的文本之间的差异。唯一的问题是它不会根据差异标记块。 ...不同编码的字符集一般不会重叠。那么合并工具应该做什么......如果不能基于抽象字符来完成,那么也不能使用二进制表示来完成。
    • 无论如何我的 +1。没有什么是完美的。我会考虑将我的脚本也转换为 Unicode 以用于较旧的来源。
    • 感谢您的赞誉。然而,我不同意如果不能基于抽象字符来完成,那么也不能使用二进制表示来完成。 如果两个文件具有相同的编码,则比较它们是完全明智的。然后,比较字符和比较字节是完全相同的事情。此外,更改单个文件的编码是完全明智的。重要的一点是,这两项任务都不是微不足道的,可能会导致意想不到的问题并需要您的注意。如果你把它们混在一起,然后你遇到了问题,你就更不可能解决它。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      1. 编辑 -> 选项
      2. 从左侧的类别窗格中选择“比较”。
      3. 复选框“忽略回车差异”(UNIX、Windows、Mac)

      【讨论】:

      • 嗨 Jamil,这个问题相当老了,它是关于不同的编码,而不是关于不同的行尾。无论如何,谢谢你的信息。
      • @pepr 实际上这解决了我的问题!谢谢 JamilShah
      【解决方案5】:

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

      如果您使用的是版本控制系统,我建议您使用以下方法:

      1. 重新签出文件
      2. 将所有文件转换为 UTF-8
      3. 提交文件
      4. 复制新文件
      5. 使用 WinMerge

      这样您最终会在历史记录中获得两次提交 - 一次用于编码更改,另一次用于内容更改,WinMerge 将按预期工作。

      【讨论】:

      • 问题是旧文档仍然存在,必须保存在编码中。新文档也是有效的,并且使用了不同的工具来处理源代码。
      【解决方案6】:

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

      【讨论】:

      • 这行得通。文件窗格在两个文件中显示正确的字母。只有比较不知道。
      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2011-05-16
      相关资源
      最近更新 更多