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?
Respuesta
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:
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
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?
Creo que si tuviera tantos problemas, usaría Perl, ya que lo sé. :) – skiphoppy
vimdiff
funciona bastante bien para este propósito.
Lo encontré al leer this StackOverflow answer.
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
- 1. Valor porcentual con GNU Diff
- 2. Alternativas a GNU diff?
- 3. grepping archivos binarios y UTF16
- 4. git diff --word-diff con archivos en línea
- 5. Cómo diferencio una rama con mi rama predeterminada
- 6. Cómo diff lista de archivos a medida con WinMerge
- 7. ¿Cómo hacer que diff funcione como git-diff?
- 8. Convierta UTF8 a UTF16 con iconv
- 9. Excluir archivos de git-diff
- 10. Mercurial: enumere archivos "hg diff"
- 11. Unix find with GNU Make para actualizar automáticamente los archivos
- 12. ¿Puede GNU hacer manejar nombres de archivos con espacios?
- 13. Cómo navego en los resultados de Diff
- 14. svn diff cuando los archivos están marcados con "historial programado con commit"
- 15. diff de subversión que incluye archivos nuevos
- 16. Versiones de datos con git: diff personalizado para archivos específicos
- 17. GNU encuentra todos los archivos ejecutables: ¿Equivalente en OS X?
- 18. Perforce pendiente diff secuencia de comandos diff
- 19. ¿Cómo obtengo la lista de archivos recientes en GNU Emacs?
- 20. Imágenes o archivos en GNU Smalltalk?
- 21. svn diff no muestra archivos externos modificados
- 22. ¿Cómo veo los comandos ejecutados por GNU?
- 23. Archivos Diff presentes en dos directorios diferentes
- 24. Incluyendo nuevos archivos en SVN diff
- 25. incluir sólo los archivos que coinciden con un patrón dado en un diff recursivo
- 26. difsing diffs con diff?
- 27. TortoiseHg con TortoiseSvn Diff
- 28. Perforce - ¿genera un diff incluyendo archivos agregados?
- 29. Cómo empaquetar archivos de datos con autoconf y automake de GNU
- 30. Atajo TFS para hacer un diff en todos los archivos modificados con la última versión
No sé sobre UTF-16, pero debería ser capaz de manejar UTF-8 bien. – Zifre