unicode - ¿Cómo diferencio los archivos utf-16 con GNU diff?
(6)
De la documentación de GNU diff:
Manejo de caracteres multibyte y de ancho variable
diff, diff3 y sdiff tratan cada línea de entrada como una cadena de caracteres unibyte. Esto puede maltratar 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.
Además, en la actualidad, diff asume que cada byte tiene un ancho de columna, y esta suposición es incorrecta en algunas configuraciones regionales, por ejemplo, configuraciones regionales que utilizan codificación UTF-8. Esto causa problemas con la opción -y o - lado a lado de diff.
Estos problemas deben solucionarse sin afectar excesivamente el rendimiento de las utilidades en entornos de unibyte.
El equipo de internacionalización del Centro de tecnología IBM GNU / Linux ha propuesto algunos parches para admitir diff internacionalizado http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz . Desafortunadamente, estos parches están incompletos y corresponden a una versión anterior de diff, por lo que se necesita hacer más trabajo en esta área.
Nunca me di cuenta de eso.
Parece que Guiffy podría hacer el trabajo si una herramienta de línea de comandos que no es libre, hará el trabajo, aún buscando una herramienta de línea de comandos de software gratuito:
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 comandos? ¿Hay una buena alternativa?
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 las lea y las escriba con los códecs adecuados).
>>> 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
Instale la utilidad ripgrep
que admite UTF-16, luego ejecute:
diff <(rg -N . file1.txt) <(rg -N . file2.txt)
ripgrep
admite la búsqueda de archivos en codificaciones de texto que no sean UTF-8, como UTF-16, latin-1, GBK, EUC-JP, Shift_JIS y más. (Se proporciona cierta compatibilidad con la detección automática de UTF-16. Otras codificaciones de texto deben especificarse específicamente con el indicador de codificación-E
/--encoding flag.
)--encoding flag.
Malforma los parches cuando se utilizan acentos o caracteres especiales:
diff --version
diff (GNU diffutils) 3.6
diff -Naur old_foo new_foo > foo.patch
Maneja correctamente las marcas de acento o los caracteres especiales, independientemente de si los archivos / directorios comparados están en una carpeta de git.
git --version
git version 2.17.1
git diff --no-index old_foo new_foo > foo.patch
Tal vez podría construir algo en Python con el excelente chardet, luego convertir sus archivos a UTF-8 y enviar esto a GNU diff.
vimdiff
funciona bastante bien para este propósito.
Lo encontré mientras leía esta respuesta de .