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

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

Мотивация: Я переписываю текстовые файлы doc, которые будут обрабатываться позже. Новые источники теперь используют UTF-8. Большие части источников одинаковы. Мне нужно найти различия.

Детали: В старых источниках документа используется кодировка cp1250, новые источники используют UTF-8. Оба новых и старых источника используют одни и те же окончания строки (CR + LF). Я использую Unicode-версию приложения WinMerge (WinMergeU.exe), версия 2.12.4.0.

Это почти работает, но... Когда линии различаются, они первоначально помечены как блок темно-желтым цветом, а разные части отмечены с использованием более светлого цвета. При перемещении курсора красного блока на панели внизу показана другая часть.

Однако блок текста отмечен темно-желтым также в случаях, когда (представление в Юникоде) текст тот же. Красный блок также перемещается в эти части файлов. В этом случае две панели внизу (которые показывают различия) содержат один и тот же текст, и ничто не помечено как другое. См. Рисунок ниже:

Example of the line that should not differ.

Самая первая строка отличается - это нормально. Но вторая строка имеет визуально одинаковое содержимое. Единственный символ вне диапазона ASCII - Ú. Он имеет другое представление в закодированных источниках. Это приводит к тому, что строка помечена как другая, но нижележащие панели не помечены символом на линии как разные.

См. также следующие абзацы, которые являются точно такими же (только кодировка в источниках отличается, используется то же окончание строки).

Похоже, что начальное сравнение было основано на двоичном представлении строк. Есть ли какой-либо параметр, чтобы сообщить WinMerge, что сравнение (я имею в виду маркировку блоков) должно основываться на содержимом Unicode?

Я старался, но не везет.

Обновление: Вышеупомянутый вопрос касался последней стабильной версии 2.12.4. Бета-версия 2.13.22 отлично работает для меня. См. мой ответ ниже.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

KDiff Compare Results

Ответ 3

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

enter image description here

Ответ 4

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

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

  • Создать новую проверку файлов
  • Преобразование всех файлов в UTF-8
  • Зафиксировать файлы
  • Скопируйте новые файлы поверх
  • Использовать WinMerge

Таким образом, вы закончите с двумя фиксациями в истории - один для изменения кодировки, а другой для изменений содержимого, и WinMerge будет работать, как ожидалось.

Ответ 5

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