2009-04-22 2 views
17

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

+0

Я не знаю о UTF-16, но он должен иметь возможность обрабатывать UTF-8. – Zifre

ответ

8

С дифф документации GNU:

Обработка мультибайтового и варьируя-Ширин Символы

дифференциалы, diff3 и SDiff лечат каждую строку ввода в виде строки однобайтном символов. В некоторых случаях это может привести к ошибкам многобайтовых символов. Например, когда просят игнорировать пробелы , diff неправильно игнорирует символ многобайтового пробела.

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

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

The IBM GNU/Linux Technology Center Интернационализация Команды предложил некоторые патчи для поддержки интернационализированного дифа 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

+0

Отражает давнюю традицию инструментов UNIX для обработки символов и байтов как равных, которые только недавно начали немного распадаться.Subversion также является широко используемым инструментом, который не может рассматривать UTF-16 как текст. – Joey

0

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

http://chardet.feedparser.org/

+0

Думаю, что если я собираюсь пойти на эту проблему, я бы использовал Perl, так как знаю это. :) – skiphoppy

0

В 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