Как мне отличить файлы utf-16 с помощью GNU diff?
GNU diff, похоже, не настолько умен, чтобы обнаруживать и обрабатывать файлы UTF-16, что меня удивляет. Я пропускаю очевидную опцию командной строки? Есть ли хорошая альтернатива?
7 ответов
Из документации GNU diff:
Обработка многобайтовых символов и символов переменной ширины
diff, diff3 и sdiff обрабатывают каждую строку ввода как строку однобайтовых символов. Это может неправильно обрабатывать многобайтовые символы в некоторых случаях. Например, когда его просят игнорировать пробелы, diff неправильно игнорирует многобайтовый пробел.
Кроме того, diff в настоящее время предполагает, что каждый байт имеет ширину в один столбец, и это предположение неверно в некоторых локалях, например, в локалях, использующих кодировку UTF-8. Это вызывает проблемы с параметром -y или - рядом друг с другом diff.
Эти проблемы необходимо исправить, не оказывая чрезмерного влияния на производительность утилит в однобайтовых средах.
Группа по интернационализации IBM GNU/Linux Technology Center предложила несколько патчей для поддержки интернационализированных различий http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz. К сожалению, эти патчи неполные и относятся к более старой версии diff, поэтому в этой области необходимо проделать дополнительную работу.
Я никогда не осознавал этого сам.
Похоже, что Guiffy мог бы справиться с этой задачей, если несвободный инструмент без командной строки выполнит эту работу, все еще ища бесплатный инструмент командной строки:
vimdiff
работает довольно хорошо для этой цели.
Я нашел это, читая этот ответ Stackru.
Устанавливать ripgrep
Утилита, которая поддерживает UTF-16, затем запустите:
diff <(rg -N . file1.txt) <(rg -N . file2.txt)
ripgrep
поддерживает поиск файлов в текстовых кодировках, отличных от UTF-8, таких как UTF-16, latin-1, GBK, EUC-JP, Shift_JIS и другие. (Предоставляется некоторая поддержка автоматического определения UTF-16. Другие кодировки текста должны быть специально указаны с помощью-E
/--encoding flag.
)
Неправильные патчи при использовании знаков ударения или специальных символов:
diff --version
diff (GNU diffutils) 3.6
diff -Naur old_foo new_foo > foo.patch
Корректно обрабатывает знаки ударения или специальные символы независимо от того, находятся ли сравниваемые файлы / каталоги в папке git.
git --version
git version 2.17.1
git diff --no-index old_foo new_foo > foo.patch
Вы можете построить что-то на python с отличным chardet, затем конвертировать ваши файлы в UTF-8 и отправить это в GNU diff?
В Python вы можете использовать difflib.HtmlDiff для создания таблицы HTML, которая показывает различия между двумя последовательностями строк, и кажется, что она отлично работает со строками Unicode (конечно, при условии, что вы читаете и пишете их с помощью соответствующих кодеков).
>>> hd = difflib.HtmlDiff()
>>> htmldiff = hd.make_file(codecs.open('file1', 'r', 'utf-16').readlines(), codecs.open('file2', 'r', 'utf-16').readlines())
>>> print >> codecs.open('diff.html', 'w', 'utf-16'), htmldiff
Meld — это инструмент сравнения с открытым исходным кодом, поддерживающий UTF-16. Это бесплатное приложение с открытым исходным кодом, поддерживаемое проектом GNOME.