2009-04-22 11 views
17

GNU diff nie wydaje się być wystarczająco inteligentny, aby wykryć i obsługiwać pliki UTF-16, co mnie zaskakuje. Czy brakuje mi oczywistej opcji wiersza poleceń? Czy istnieje dobra alternatywa?Jak mogę diff utf-16 plików z GNU diff?

+0

Nie wiem o UTF-16, ale powinien być w stanie obsłużyć karę UTF-8. – Zifre

Odpowiedz

8

Z dokumentacji GNU diff:

Handling wielobajtową i różnej szerokości Postacie

diff, diff3 i sdiff traktują każdą linię wejścia jako ciąg unibyte znaków. W niektórych przypadkach może to być niezgodne z wieloma znakami wielobajtowymi . Na przykład, gdy poproszono o ignorowanie spacji , diff nie ignoruje poprawnie znaku wielobajtowego.

Ponadto, edycja Obecnie zakłada się, że każdy bajt jest szeroki jedną kolumnę, i w tym założenie jest błędnie niektórych lokalizacjach, na przykład, lokalizacyjnych, UTF-8 kodowania. Powoduje to problemy z opcją -y lub --side-by-side z diff.

Te problemy należy naprawić bez niepotrzebnego wpływu na wydajność środowisk w środowiskach unibajtowych .

IBM GNU/Linux Centrum Technologii internacjonalizacji Zespół zaproponował jakieś łaty do obsługi umiędzynarodowionego diff http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz. Niestety, te poprawki są niekompletne i są w starszej wersji z diff, więc więcej pracy musi być wykonane w tym obszarze.

Nigdy nie zdawałem sobie z tego sprawy.

Wygląda Guiffy mogła do pracy czy nonfree, linia narzędzie non-komenda wykona pracę, wciąż szuka darmowe narzędzie wiersza poleceń:

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

+0

Odzwierciedla długą tradycję narzędzi UNIX do traktowania znaków i bajtów jako równych, które dopiero niedawno zaczęły się nieco załamywać.Subversion jest również szeroko stosowanym narzędziem, które nie może traktować UTF-16 jako tekstu. – Joey

0

Można może zbudować coś w python z doskonałym chardet, a następnie przekonwertować pliki na UTF-8 i wysłać to do GNU diff?

http://chardet.feedparser.org/

+0

Myślę, że gdybym miał zadać sobie tyle trudu, użyłbym Perla, ponieważ wiem o tym. :) – skiphoppy

0

W języku Python można użyć polecenia difflib.HtmlDiff, aby utworzyć tabelę HTML, która pokazuje różnice między dwiema sekwencjami linii, i wydaje się działać dobrze z ciągami Unicode (pod warunkiem, że czytasz i zapisujesz je za pomocą odpowiednie kodeki).

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