WinMerge: как сравнивать файлы с одинаковым контентом, но разными кодировками?

мотивация: я переписываю doc -- текстовые файлы, которые будут обработаны позже. Новые источники теперь используют 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 отлично работает для меня. См.мой ответ ниже.

5 ответов


Я думаю, это действительно не должно быть задачей инструмент слияния, чтобы позволить слияние файлов, хранящихся в разных кодировках.

кодировка-это функция, которая сопоставляет байты (хранящиеся на диске или в памяти) с символами (отображаемыми на экране). К сожалению, по умолчанию кодировка файла не сохраняется вместе с файлом. Поэтому любая программа, которая хочет открыть файл и отобразить его содержимое нужно угадать кодировку. Хотя это иногда работает, это также ошибка процедуры лежа.

теперь наборы символов разных кодировок вообще не перекрываются. Итак, что должен делать инструмент слияния, если вы объединяете символ C из файла A в кодировке X в файл B в кодировке Y, если символ C не является частью набора символов кодировки Y?

таким образом, я думаю, что задача инструмента слияния должна заключаться в объединении двоичного содержимого. Все остальное-грязный хак и проклятый провал на каком-то уровне. (Производитель инструментов слияния может решить предоставить слияние уровней символов, которое также может работать большую часть времени. Но есть некоторые догадки.)

поэтому я также рекомендую вам сначала перевести старые файлы в UTF-8, а затем объединить их с новыми версиями.


Это на самом деле не отвечает на ваш вопрос о WinMerge, но вы рассматривали возможность использования другой программы diff? Один из моих любимых kdiff - http://kdiff3.sourceforge.net/

когда я делаю сравнение на KDiff, используя один файл UTF8 и другой файл Unicode, я получаю следующее:KDiff Compare Warning

вот экран сравнения-обратите внимание, что кодировки в файлах разные, но файлы считаются равными из текста точка зрения:

KDiff Compare Results


просто для вашей информации. Вопрос был для последней стабильной 2.12.4. Я пробовал бета-версию 2.13.22, и она отлично работает для меня. См. разницу для точно таких же файлов - были удалены только первые строки в файлах. (Большое спасибо авторам.)

enter image description here


Я бы порекомендовал конвертация файлов в той же кодировке, прежде чем сравниваете.

Если вы работаете с системой контроля версий, я бы рекомендовал следующее:

  1. создать новую проверку файлов
  2. конвертировать все файлы в UTF-8
  3. совершил файлы
  4. скопируйте новые файлы через
  5. Использовать WinMerge

таким образом, вы получаете два коммита в истории-один для изменения кодировки а еще для изменения контента и WinMerge будет работать так, как ожидалось.


Как вариант File -> File Encoding... в WinMerge лежит? Позволяет самостоятельно устанавливать кодировку файлов.