Existe um comando Linux para descobrir se um arquivo é UTF-8?

14

Os .iniarquivos do Joomla precisam ser salvos como UTF-8.

Após a edição, não tenho certeza se os arquivos são UTF-8 ou não.

Existe um comando como o Linux fileou alguns comandos que informam se um arquivo é realmente UTF-8 ou não?

Edward
fonte
4
Você não pode dizer a codificação de um arquivo. Você só pode fazer um palpite inteligente. Você pode adivinhar o que é certo, mas às vezes as suposições falham. fileé um exemplo de um programa que faz suposições inteligentes.
Marco
11
@Marco: É possível verificar se é UTF-8 válido ou não, no entanto. Existem algumas codificações que podem passar por UTF-8 válidas por engano, mas isso quase nunca acontece com codificações / caracteres de ISO-8859-𝒏 ou Windows-125..
user1686

Respostas:

28

Você pode determinar a codificação do arquivo com o seguinte comando:

file -bi filename
Rik
fonte
3
@nicolas Para o MacOS, você pode tentar file -I filename(-I é uma capital i).
Rik
5
Isso lê o arquivo inteiro?
Ctrl-alt-delor 30/0318
2
@ kojow7 utf-8 não tem cabeçalho. O ASCII puro (somente 7 bits) é indistinguível do utf-8 (esse é o ponto, um cabeçalho causará todo tipo de problema). Portanto, se você tiver um arquivo ASCII para o primeiro MB e tiver um único caractere UTF-8, não saberá, a menos que leia o arquivo inteiro.
ctrl-alt-Delor
3
Isso não deve ser aceito como resposta. O comando 'arquivo' não faz isso; ele lê apenas parte do arquivo e usa números mágicos para adivinhar. Ocasionalmente, o 'arquivo' pode e dará a resposta incorreta. Para verificar se um arquivo passa uma codificação como ascii, iso-8859-1, utf-8 ou o que for, então uma boa solução é usar o comando 'iconv'.
Tim
11
Eu testei e pode falhar.
Tim
9

Existe, use o isutf8comando do pacote moreutils .

Fonte: Como você pode saber se um arquivo está codificado em UTF-8 ou não?


Pablo Olmos de Aguilera C.
fonte
@davidpostill Estou curioso, é uma má prática citar o autor na referência?
Pablo Olmos de Aguilera C.
Não. No entanto, é uma boa prática fazer o link dizer para onde ele me leva. Suponha que eu esteja lendo apenas o texto azul. Após a edição, posso dizer por que e quando devo clicar nela. Antes, eu não podia. (Não fui eu quem fez a edição, mas tenho quase 94% de certeza de que é disso que se tratava.) #
305 Hermann Döppes
Agradável e funciona bem find -type f -exec isutf8 {} +, porque também cita o nome do arquivo. (E com o uso find ... -exec ... +também é rápido)
Tomasz Gandor
2

Não use o filecomando Ele não inspeciona o arquivo inteiro e basicamente adivinha. Às vezes, fornece respostas incorretas.

Você pode verificar se um arquivo passa a codificação UTF-8 assim:

$ iconv -f utf8 <filename> -t utf8 -o /dev/null

Um código de retorno zero significa que ele passa UTF8. Um código de retorno diferente de zero significa que não é UTF8 válido.

Não é possível saber se um arquivo foi necessariamente exportado usando um esquema de codificação específico, pois alguns esquemas de codificação se sobrepõem. Para fazer isso, é necessário que os metadados sejam incorporados ao arquivo, e mesmo assim você confiaria em quem gerou esse arquivo, em vez de validá-lo por conta própria ... e você sempre deve validá-lo.

Tim
fonte
0

Ainda outra maneira é usar recode, que sairá com um erro se tentar decodificar UTF-8 e encontrar caracteres inválidos.

if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
    echo "Valid utf8 : $FILE"
else
    echo "NOT valid utf8: $FILE"
fi
mivk
fonte