unicode diff gnu

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:

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

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.

http://chardet.feedparser.org/


vimdiff funciona bastante bien para este propósito.

Lo encontré mientras leía esta respuesta de .