Как мне отличить файлы 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 мог бы справиться с этой задачей, если несвободный инструмент без командной строки выполнит эту работу, все еще ища бесплатный инструмент командной строки:

http://www.guiffy.com/Diff-Tool.html

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?

http://chardet.feedparser.org/

В 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.

Другие вопросы по тегам