Как мне отличить файлы utf-16 с помощью GNU diff? - PullRequest
19 голосов
/ 22 апреля 2009

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

Ответы [ 6 ]

11 голосов
/ 13 ноября 2009

vimdiff прекрасно работает для этой цели.

Я нашел его при чтении этого ответа StackOverflow .

8 голосов
/ 22 апреля 2009

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

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

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

Кроме того, diff в настоящее время предполагает, что каждый байт шириной в один столбец, и это предположение неверно в некоторых локали, например локали, использующие UTF-8 кодирование. Это вызывает проблемы с опция -y или - by-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. К сожалению, эти патчи неполные и относятся к более старой версии из различий, так что больше работы нужно сделать в этой области.

Я никогда не осознавал этого.

Похоже, что Guiffy мог бы выполнить эту работу, если несвободный инструмент, не использующий командную строку, выполнит работу, все еще ища бесплатный инструмент командной строки:

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

1 голос
/ 02 февраля 2019

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

 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
1 голос
/ 17 января 2019

Установить 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.)

0 голосов
/ 10 февраля 2012

В 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
0 голосов
/ 30 апреля 2009

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

http://chardet.feedparser.org/

...