Как мне удалить файлы utf-16 с помощью GNU diff?

GNU diff не кажется достаточно умным, чтобы обнаруживать и обрабатывать файлы UTF-16, что меня удивляет. У меня отсутствует очевидная опция командной строки? Есть ли хорошая альтернатива?

Ответ 1

Из документации по GNU diff:

Обработка многобайтов и изменение ширины Символы

diff, diff3 и sdiff обрабатывают каждую строку ввода как строки унибайта персонажи. Это может неправильно многобайтовых символов в некоторых случаях. Например, когда его просят игнорировать пробелы, diff неправильно игнорирует многобайтовый пробельный символ.

Кроме того, diff в настоящее время предполагает, что каждый байт имеет ширину в одну колонку, и это предположение неверно в некоторых локали, например, локали, которые используют UTF-8 кодирование. Это вызывает проблемы с вариант -y или -side-by-side дифф.

Эти проблемы необходимо исправить без чрезмерного воздействия на производительность утилит в однобайтовые среды.

Технологический центр IBM GNU/Linux Группа по интернационализации предложила некоторые исправления для поддержки интернационализированный diff 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

Ответ 3

Установите утилиту ripgrep которая поддерживает UTF-16, затем запустите:

diff <(rg -N . file1.txt) <(rg -N . file2.txt)

ripgrep поддерживает поиск файлов в текстовых кодировках, отличных от UTF-8, таких как UTF-16, latin-1, GBK, EUC-JP, Shift_JIS и других. (-E некоторая поддержка автоматического определения UTF-16. Другие кодировки текста должны быть специально указаны с помощью -E/--Encoding flag.)

Ответ 4

Возможно, вы могли бы создать что-то в python с превосходным набором, а затем конвертировать ваши файлы в UTF-8 и отправить это в GNU diff?

http://chardet.feedparser.org/

Ответ 5

В 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

Ответ 6

Неправильные патчи при использовании знаков ударения или специальных символов:

 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