GNU diff не кажется достаточно умным, чтобы обнаруживать и обрабатывать файлы UTF-16, что меня удивляет. У меня отсутствует очевидная опция командной строки? Есть ли хорошая альтернатива?
Как мне удалить файлы utf-16 с помощью GNU diff?
Ответ 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 смог выполнить эту работу, если беззаботный инструмент без командной строки выполнит эту работу, все еще ищет бесплатный инструмент командной строки:
Ответ 2
vimdiff
подходит для этой цели.
Я нашел его при чтении fooobar.com/questions/51786/....
Ответ 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?
Ответ 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