Como detectar automaticamente codificação de arquivo de texto?

57

Existem muitos arquivos de texto simples que foram codificados em charsets variantes.

Eu quero converter todos eles para UTF-8, mas antes de executar o iconv, preciso saber sua codificação original. A maioria dos navegadores tem uma opção Auto Detect nas codificações, no entanto, não posso verificar esses arquivos de texto um por um, porque há muitos.

Só conhecendo a codificação original, posso converter os textos por iconv -f DETECTED_CHARSET -t utf-8 .

Existe algum utilitário para detectar a codificação de arquivos de texto simples? NÃO precisa ser 100% perfeito, não me importo se houver 100 arquivos mal convertidos em 1.000.000 de arquivos.

    
por Xiè Jìléi 24.06.2011 / 10:07

9 respostas

45

Experimente o módulo Python chardet , que está disponível no PyPi:

pip install chardet

Em seguida, execute chardetect myfile.txt .

O Chardet é baseado no código de detecção usado pela Mozilla, por isso deve dar resultados razoáveis , desde que o texto de entrada seja longo o suficiente para análise estatística. Leia a documentação do projeto .

Como mencionado nos comentários, é bastante lento, mas algumas distribuições também enviam a versão original em C ++, já que o @Xavier encontrou no link . Há também uma versão do Java em algum lugar.

    
por 24.06.2011 / 10:37
31

Eu usaria esse comando simples:

encoding=$(file -bi myfile.txt)

Ou se você quiser apenas o conjunto de caracteres real (como utf-8 ):

encoding=$(file -b --mime-encoding myfile.txt)
    
por 28.10.2011 / 20:52
26

No Linux baseado em Debian, o pacote uchardet ( Debian / Ubuntu ) fornece uma ferramenta de linha de comando . Veja abaixo a descrição do pacote:

 universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
    
por 18.06.2013 / 14:44
16

Para Linux, há enca e para o Solaris você pode usar auto_ef .

    
por 24.06.2011 / 10:38
2

Voltando ao chardet (python 2.?) esta chamada pode ser suficiente:

python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Embora esteja longe de ser perfeito ...

echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}
    
por 23.01.2014 / 17:12
1

Vale a pena tentar o UTFCast. Não funcionou para mim (talvez porque meus arquivos são terríveis), mas parece bom.

link

    
por 03.09.2011 / 02:48
1

A Mozilla tem uma boa base de código para detecção automática em páginas da Web: link

Descrição detalhada do algoritmo: link

    
por 11.10.2013 / 18:06
1

Para aqueles que usam regularmente o Emacs, eles podem achar útil o seguinte (permite inspecionar e validar manualmente a transfomação).

Além disso, muitas vezes eu acho que a detecção automática do conjunto de caracteres do Emacs é muito mais eficiente do que as outras ferramentas de detecção automática de conjuntos de caracteres (como o chardet).

(setq paths (mapcar 'file-truename '(
 "path/to/file1"
 "path/to/file2"
 "path/to/file3"
)))

(dolist (path paths)
  (find-file path)
  (set-buffer-file-coding-system 'utf-8-unix)
  )

Então, uma simples chamada para o Emacs com este script como argumento (veja a opção "-l") faz o trabalho.

    
por 06.11.2018 / 16:42
0

isutf8 (do pacote moreutils ) fez o trabalho

    
por 28.10.2015 / 18:34