2009-04-22 7 views
17

GNU diff no parece ser lo suficientemente inteligente como para detectar y manejar archivos UTF-16, lo que me sorprende. ¿Me estoy perdiendo una opción obvia de línea de comando? ¿Hay una buena alternativa?¿Cómo diferencio los archivos utf-16 con diff de GNU?

+0

No sé sobre UTF-16, pero debería ser capaz de manejar UTF-8 bien. – Zifre

Respuesta

8

De la documentación GNU diff:

Manejo de varios bytes y variando de ancho Caracteres

diff, diff3 y sdiff tratar cada línea de entrada como una cadena de caracteres unibyte . Esto puede manejar mal los caracteres multibyte en algunos casos. Por ejemplo, cuando se le pide que ignore los espacios , diff no ignora correctamente un carácter de espacio multibyte.

También, diff Actualmente asume que cada byte es una columna de ancho, y esta suposición es incorrecta en algunos locales, por ejemplo, locales que utilizan UTF-8 codificación. Esto causa problemas con la opción -y o -side-by-side de diff.

Estos problemas necesitan ser fijo sin afectar indebidamente el desempeño de las utilidades en entornos unibyte.

El IBM GNU/Linux Technology Center internacionalización equipo ha propuesto algunos parches para apoyar diff internacionalizado http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz. Lamentablemente, estos parches son incompletos y están en una versión anterior de diff, por lo que es necesario realizar más trabajos en esta área.

Nunca me di cuenta de eso.

Parece que Guiffy podría al trabajo si una herramienta de línea que no es libre, no comando hará el trabajo, todavía en busca de una herramienta de línea de comandos freeware:

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

+0

Refleja la larga tradición de las herramientas de UNIX para tratar caracteres y bytes como iguales, que recientemente comenzaron a romperse un poco.Subversion es también una herramienta ampliamente utilizada que no puede tratar UTF-16 como texto. – Joey

0

Se podría tal vez construir algo en Python con el excelente chardet, luego convierta sus archivos a UTF-8 y envíe esto a GNU diff?

http://chardet.feedparser.org/

+0

Creo que si tuviera tantos problemas, usaría Perl, ya que lo sé. :) – skiphoppy

0

En Python, puede usar difflib.HtmlDiff para crear una tabla HTML que muestre las diferencias entre dos secuencias de líneas, y parece funcionar bien con cadenas Unicode (siempre que, por supuesto, las lea y las escriba con el códecs apropiados).

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