Pergunta

GNU diff não parece ser suficiente inteligente para detectar e lidar com UTF-16 arquivos, o que me surpreende. Estou faltando uma opção de linha de comando óbvio? Existe uma boa alternativa?

Foi útil?

Solução

A partir da documentação diff GNU:

Manipulação Multibyte e variando-Largura Caracteres

diff, diff3 e sdiff tratar cada linha de entrada como uma seqüência de unibyte personagens. Isso pode maltratar caracteres de vários bytes em alguns casos. Por exemplo, quando pediu para ignorar espaços, diff não adequadamente ignorar um caractere de espaço de vários bytes.

Além disso, diff assume actualmente que cada byte é uma coluna de largura, e este assunção é incorrecta em alguns locais, por exemplo, localidades que usam UTF-8 codificação. Isso faz com que problemas com o -y ou --side-a-lado de opção diff.

Esses problemas precisam ser corrigidos sem afectar indevidamente a o desempenho dos serviços públicos em ambientes unibyte.

O Centro de Tecnologia IBM GNU / Linux Internacionalização equipe propôs alguns patches para apoio diff internacionalizada http: / /oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz . Infelizmente, essas manchas são incompleta e estão a uma versão mais antiga de diff, por isso, mais trabalho precisa ser feito nesta área.

Eu nunca percebi que eu mesmo.

Parece que Guiffy poderia para o trabalho, se um não-livre, ferramenta de linha de comando não irá fazer o trabalho, ainda à procura de uma ferramenta de linha de comando gratuito:

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

Outras dicas

vimdiff funciona muito bem para esta finalidade.

Eu encontrei-o ao ler este StackOverflow responder .

Instale ripgrep utilidade que suporta UTF-16, em seguida, executar:

diff <(rg -N . file1.txt) <(rg -N . file2.txt)

suportes ripgrep pesquisando arquivos em diferentes UTF-8 codificações de texto, como UTF-16, Latin-1, GBK, EUC-JP, Shift_JIS e muito mais. (É fornecido Algum suporte para detectar automaticamente UTF-16. Outras codificações de texto deve ser especificamente especificado com o -E / --encoding flag.)

malforms remendos quando são utilizados acentos ou caracteres especiais:

 diff --version
 diff (GNU diffutils) 3.6
 diff -Naur old_foo new_foo > foo.patch

Corretamente lida com acentos ou caracteres especiais, independentemente de arquivos comparados / diretórios estão em uma pasta git.

 git --version
 git version 2.17.1
 git diff --no-index old_foo new_foo > foo.patch

Você talvez pudesse construir algo em python com o excelente chardet, em seguida, converter seus arquivos para UTF-8 e enviá-lo para GNU diff?

http://chardet.feedparser.org/

Em Python, você pode usar difflib.HtmlDiff para criar uma tabela HTML que mostra as diferenças entre duas seqüências de linhas, e parece funcionar bem com cadeias de caracteres Unicode (desde que, é claro, você ler e escrever-los com o apropriado 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top