17

动机: 我正在重写一个文档——稍后处理的文本文件。新来源现在使用 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 非常适合我。请参阅下面的答案

4

6 回答 6

10

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

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

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

KDiff 比较结果

于 2013-01-22T20:03:11.103 回答
8

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

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

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

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

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

于 2013-01-29T15:07:25.370 回答
4

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

在此处输入图像描述

于 2013-01-30T14:24:07.907 回答
3
  1. 编辑 -> 选项
  2. 从左侧的类别窗格中选择“比较”。
  3. 复选框“忽略回车差异”(UNIX、Windows、Mac)
于 2020-02-14T09:37:33.720 回答
1

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

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

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

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

于 2013-01-29T14:10:01.153 回答
0

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

于 2013-01-29T14:51:23.923 回答