2011-06-24 08:07:02 +0000 2011-06-24 08:07:02 +0000
74
74

Como detectar automaticamente a codificação de ficheiros de texto?

Há muitos ficheiros de texto simples que foram codificados em caracteres variantes.

Quero convertê-los todos para UTF-8, mas antes de executar o iconv, preciso de saber a sua codificação original. A maioria dos browsers tem uma opção Auto Detect em codificações, no entanto, não posso verificar esses ficheiros de texto um a um porque há demasiados.

Apenas tendo conhecido a codificação original, posso então converter os textos por iconv -f DETECTED_CHARSET -t utf-8.

Existe alguma utilidade para detectar a codificação de ficheiros de texto simples? NÃO tem de ser 100% perfeito, não me importo se houver 100 ficheiros mal convertidos em 1.000.000 de ficheiros.

Respostas (9)

62
62
62
2011-06-24 08:37:06 +0000

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

pip install chardet

Depois corra chardetect myfile.txt.

Chardet é baseado no código de detecção utilizado pela Mozilla, pelo que deve dar resultados razoáveis, desde que o texto de entrada seja suficientemente longo para análise estatística. Leia a documentação do projecto .

Como mencionado nos comentários é bastante lento, mas algumas distribuições também enviam a versão original em C++ como @Xavier encontrou em https://superuser.com/a/609056 . Há também uma versão Java algures.

30
30
30
2013-06-18 12:44:37 +0000

Em Linux baseado em Debian, o pacote uchardet Debian / Ubuntu ) fornece uma ferramenta de linha de comando. Ver 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
16
16
16
2011-06-24 08:38:40 +0000

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

2
2
2
2013-10-11 16:06:44 +0000

Mozilla tem uma boa base de código para auto-detecção em páginas web: http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/

Descrição detalhada do algoritmo: http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html

2
2
2
2018-11-06 15:42:35 +0000

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

Além disso, acho muitas vezes que a autodetecção do conjunto de cartas Emacs é muito mais eficiente do que as outras ferramentas de autodetecção do conjunto de cartas (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 ao Emacs com este argumento (ver a opção “-l”) faz o trabalho.

1
1
1
2015-10-28 17:34:06 +0000

isutf8 (do pacote moreutils) fez o trabalho

1
1
1
2014-01-23 16:12:16 +0000

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 perfeita….

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

0x1&

1
1
1
2011-09-03 00:48:04 +0000

UTFCast vale a pena tentar. Não funcionou para mim (talvez porque os meus ficheiros são terríveis), mas tem bom aspecto. http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/

0
0
0
2019-07-12 16:39:09 +0000

Também no caso de arquivar -i dá-lhe

Pode usar este comando php que pode adivinhar charset como abaixo :

Em php pode verificar como em baixo :

Especificando lista de codificação explicitamente :

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

Mais preciso “ mb_list_encodings”:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

Aqui no primeiro exemplo, pode ver que coloquei uma lista de codificações (detectar ordem da lista) que podem ser correspondentes. Para ter um resultado mais preciso, pode utilizar todas as codificações possíveis através de :

Nota mb_* as funções mb_* requerem php-mbstring

apt-get install php-mbstring

Ver resposta : https://stackoverflow.com/a/57010566/3382822