Preciso encontrar a codificação de todos os arquivos que são colocados em um diretório. Existe uma maneira de encontrar a codificação usada?
O file
comando não é capaz de fazer isso.
A codificação que me interessa é: ISO-8859-1. Se a codificação for qualquer outra coisa, desejo mover o arquivo para outro diretório.
apropos encoding
. Ele pesquisa os títulos e descrições de todas as páginas de manual. Quando faço isso na minha máquina, eu vejo 3 ferramentas que podem me ajudar, a julgar por suas descrições:chardet
,chardet3
,chardetect3
. Então, aoman chardet
ler e ler a página de manual,chardet
é preciso apenas o utilitário de que preciso.us-ascii
, mas depois de adicionar uma linha de comentário em chinês, ele se torneutf-8
.file
pode dizer a codificação lendo o conteúdo do arquivo e adivinhe.Respostas:
Parece que você está procurando
enca
. Pode adivinhar e até converter entre codificações. Basta olhar para a página do manual .Ou, na sua falta, use
file -i
(linux) oufile -I
(osx). Isso produzirá informações do tipo MIME para o arquivo, que também incluirá a codificação do conjunto de caracteres. Também encontrei uma página de manual para ele :)fonte
enca
parece ser completamente inútil para analisar um arquivo escrito em inglês, mas se você estiver procurando algo em estoniano, isso poderá resolver todos os seus problemas. Ferramenta muito útil, que ... </ sarcasm>Se você gosta de fazer isso para vários arquivos
fonte
Do not prepend filenames to output lines
file -b --mime-encoding
as saídas apenas o charset encodinguchardet - Uma biblioteca de detectores de codificação portada do Mozilla.
Uso:
Várias distribuições Linux (Debian / Ubuntu, OpenSuse-packman, ...) fornecem binários.
fonte
sudo apt-get install uchardet
é tão fácil que eu não decidiu se preocupar com isso ...uchardet
possui uma grande vantagemfile
eenca
, na medida em que analisa o arquivo inteiro (apenas tentei com um arquivo 20GiB), em vez de apenas o começo.Aqui está um exemplo de script usando o arquivo -I e iconv, que funciona no MacOsX. Para sua pergunta, você precisa usar mv em vez de iconv
fonte
file -b --mime-encoding
saídas apenas o charset, assim você pode evitar todo o processamento de tubosÉ realmente difícil determinar se é iso-8859-1. Se você tiver um texto com apenas caracteres de 7 bits, também pode ser iso-8859-1, mas não sabe. Se você tiver caracteres de 8 bits, os caracteres da região superior também existirão em codificações de ordem. Portanto, você teria que usar um dicionário para entender melhor qual é a palavra e determinar a partir de qual letra deve ser. Finalmente, se você detectar que ele pode ser utf-8, você tem certeza de que não é iso-8859-1
Codificação é uma das coisas mais difíceis de fazer, porque você nunca sabe se nada está lhe dizendo
fonte
No Debian você também pode usar
encguess
::fonte
uchardet
no Ubuntu e ele me disse que meu arquivo eraWINDOWS-1252
. Eu sei que isso estava errado, porque eu salvei como UTF-16 com Kate, para testar. No entanto,encguess
adivinhe corretamente e foi pré-instalado no Ubuntu 19.04.Para converter codificação de 8859 para ASCII:
fonte
Com o Python, você pode usar o módulo chardet: https://github.com/chardet/chardet
fonte
Isso não é algo que você pode fazer de maneira infalível. Uma possibilidade seria examinar todos os caracteres no arquivo para garantir que ele não contenha caracteres nos intervalos
0x00 - 0x1f
ou0x7f -0x9f
, mas, como eu disse, isso pode ser verdade para qualquer número de arquivos, incluindo pelo menos uma outra variante da ISO8859.Outra possibilidade é procurar palavras específicas no arquivo em todos os idiomas suportados e ver se você as encontra.
Por exemplo, encontre o equivalente do inglês "and", "but", "to", "of" e assim por diante em todos os idiomas suportados do 8859-1 e verifique se eles têm um grande número de ocorrências dentro do Arquivo.
Não estou falando de tradução literal como:
embora isso seja possível. Estou falando de palavras comuns no idioma de destino (pelo que sei, islandês não tem palavra para "e" - você provavelmente teria que usar a palavra para "peixe" [desculpe, isso é um pouco estereotipado, eu não significa qualquer ofensa, apenas ilustrando um ponto]).
fonte
Sei que você está interessado em uma resposta mais geral, mas o que é bom em ASCII geralmente é bom em outras codificações. Aqui está um liner Python para determinar se a entrada padrão é ASCII. (Tenho certeza de que isso funciona no Python 2, mas só o testei no Python 3.)
fonte
Se você está falando sobre arquivos XML (ISO-8859-1), a declaração XML dentro deles especifica a codificação:
<?xml version="1.0" encoding="ISO-8859-1" ?>
Portanto, você pode usar expressões regulares (por exemplo, com
perl
) para verificar cada arquivo para essa especificação.Mais informações podem ser encontradas aqui: Como determinar a codificação de arquivo de texto .
fonte
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
fonte
No Cygwin, parece que funciona para mim:
Exemplo:
Você pode canalizar isso para o awk e criar um comando iconv para converter tudo em utf8, a partir de qualquer codificação de origem suportada pelo iconv.
Exemplo:
fonte
Você pode extrair a codificação de um único arquivo com o comando file. Eu tenho um arquivo sample.html com:
sample.html: documento HTML, texto Unicode UTF-8, com linhas muito longas
Documento HTML, texto Unicode UTF-8, com linhas muito longas
texto / html; charset = utf-8
utf-8
fonte
Estou usando o seguinte script para
.
fonte
com este comando:
você pode listar todos os arquivos em um diretório e subdiretórios e a codificação correspondente.
fonte
Com Perl, use Encode :: Detect.
fonte