Existem muitos arquivos de texto sem formatação que foram codificados em conjuntos de caracteres variantes.
Quero convertê-los todos para UTF-8, mas antes de executar o iconv, preciso conhecer sua codificação original. A maioria dos navegadores tem uma Auto Detect
opção em codificações, no entanto, não consigo verificar esses arquivos de texto um por um porque há muitos.
Depois de conhecer 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 sem formatação? NÃO precisa ser 100% perfeito, não me importo se houver 100 arquivos convertidos incorretamente em 1.000.000 de arquivos.
python-chardet
no repositório do universo Ubuntu.chardet
ainda dará o palpite mais correto, como./a.txt: GB2312 (confidence: 0.99)
. Comparado com o Enca, que apenas falhou e relata 'Codificação não reconhecida'. No entanto, infelizmente,chardet
corre muito devagar.chardet <(head -c4000 filename.txt)
foi muito mais rápida e igualmente bem-sucedida para o meu caso de uso. (no caso, não está claro esta sintaxe festa irá enviar apenas os primeiros 4000 bytes para Chardet)chardet==3.0.4
, e o nome real do executável da ferramenta de linha de comandochardetect
não échardet
.Eu usaria este comando simples:
Ou se você deseja apenas o conjunto de caracteres real (como
utf-8
):fonte
file
apenas detecta codificações com propriedades específicas, como UTF-8 ou UTF-16. O restante - ISO8859 antigo ou seus correspondentes do MS-DOS e Windows - são listados como "8 bits desconhecidos" ou algo semelhante, mesmo para arquivoschardet
detectados com 99% de confiança.No Linux baseado no Debian, o pacote uchardet ( Debian / Ubuntu ) fornece uma ferramenta de linha de comando. Veja abaixo a descrição do pacote:
fonte
uchardet
via Homebrew.iconv
funciona bem.Para Linux, existe enca e, para Solaris, você pode usar auto_ef .
fonte
enca -d -L zh ./a.txt
falhou com a mensagem./a.txt: Unrecognized encoding Failure reason: No clear winner.
Como o @grawity mencionou,chardet
é mais relaxado, porém ainda é muito lento.O Mozilla possui uma boa base de código para detecção automática em páginas da web:
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
Descrição detalhada do algoritmo:
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
fonte
Voltando ao chardet (python 2.?), Essa chamada pode ser suficiente:
Embora esteja longe de ser perfeito ...
fonte
Para aqueles que usam regularmente o Emacs, eles podem achar o seguinte útil (permite inspecionar e validar manualmente a transfomação).
Além disso, muitas vezes acho que a detecção automática de conjunto de caracteres do Emacs é muito mais eficiente do que as outras ferramentas de detecção automática de conjunto de caracteres (como chardet).
Então, uma simples chamada para o Emacs com este script como argumento (consulte a opção "-l") faz o trabalho.
fonte
Vale a pena experimentar o UTFCast. Não funcionou para mim (talvez porque meus arquivos sejam terríveis), mas parece bom.
http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/
fonte
isutf8
(domoreutils
pacote) fez o trabalhofonte
Também no caso de você arquivar -i, você não sabe
Você pode usar este comando php que pode adivinhar o charset como abaixo:
No php você pode conferir como abaixo:
Especificando lista de codificação explicitamente:
" Mb_list_encodings " mais preciso :
Aqui no primeiro exemplo, você pode ver que eu coloquei uma lista de codificações (detectar a ordem da lista) que podem estar correspondentes. Para obter resultados mais precisos, você pode usar todas as codificações possíveis em: mb_list_encodings ()
Nota As funções mb_ * requerem php-mbstring
Consulte a resposta: https://stackoverflow.com/a/57010566/3382822
fonte