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