Comment puis-je diff fichiers utf-16 avec GNU diff?
Question
GNU diff ne semble pas être assez intelligent pour détecter et gérer les fichiers UTF-16, ce qui me surprend. Est-ce que je manque une option de ligne de commande évidente? Y at-il une bonne alternative?
La solution
De la documentation GNU diff:
Manutention Multibyte et en faisant varier de largeur Caractères
diff, diff3 et sdiff traiter chaque ligne d'entrée en tant que chaîne de unibyte personnages. Cela peut mishandle caractères multi-octets, dans certains cas. Par exemple, lorsqu'on lui a demandé d'ignorer espaces, diff n'ignore pas correctement un espace multi-octets.
, diff suppose également que chaque actuellement octet est une colonne de large, et ce supposition est incorrecte dans certains locales, par exemple, les paramètres régionaux qui utilisent UTF-8 codage. Cela provoque des problèmes avec l'option -y ou --side-à-côte de diff.
Ces problèmes doivent être fixés sans affecter indûment la la performance des services publics en environnements unibyte.
Le IBM GNU / Linux Technology Center Internationalisation équipe a proposé quelques patches pour le support diff internationalisé http: / /oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz. Malheureusement, ces patchs sont incomplets et sont une ancienne version de diff, donc plus de travail doit être fait dans ce domaine.
Je ne avais jamais réalisé que moi-même.
On dirait que Guiffy pourrait au travail si un non-libre, outil de ligne non-commande fera le travail, toujours à la recherche d'un outil de ligne de commande freeware:
Autres conseils
vimdiff
fonctionne assez bien à cet effet.
Je l'ai trouvé en ce StackOverflow répondre .
Installer ripgrep
utilitaire qui supporte UTF-16, puis exécuter:
diff <(rg -N . file1.txt) <(rg -N . file2.txt)
ripgrep
prend en charge la recherche de fichiers dans encodages texte autres que UTF-8, comme UTF-16, latin-1, GBK, EUC-JP, Shift_JIS et plus. (Certains de support pour détecter automatiquement UTF-16 est fourni. Les autres codages de texte doivent être spécifiés spécifiquement avec le-E
/--encoding flag.
)
malforms patches lorsque des accents ou des caractères spéciaux sont utilisés:
diff --version
diff (GNU diffutils) 3.6
diff -Naur old_foo new_foo > foo.patch
poignées correctement les accents ou des caractères spéciaux si des fichiers par rapport / dirs sont dans un dossier git.
git --version
git version 2.17.1
git diff --no-index old_foo new_foo > foo.patch
Vous pourriez peut-être construire quelque chose en python avec l'excellent chardet, puis convertir vos fichiers en UTF-8 et l'envoyer à GNU diff?
En Python, vous pouvez utiliser difflib.HtmlDiff pour créer un tableau HTML qui montre les différences entre les deux séquences de lignes, et il semble fonctionner correctement avec des chaînes Unicode (à condition, bien sûr, vous lisez et écrivez-le approprié codecs).
>>> 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