Como posso ver qual codificação é usada em um arquivo

23

Eu tive alguns problemas com arquivos de legenda no omxplayer de vídeo. Para resolvê-lo, tive que converter da codificação windows-1250 para UTF-8. Minha pergunta é: como posso ver em algum arquivo específico qual codificação é usada?

NonStandardModel
fonte
piconvalterar a codificação;)
Rinzwind 26/01
Sim. Eu já mudei a codificação (em 1 arquivo). Mas eu tenho muitos deles e queria criar um pequeno script que controlasse todos eles e depois encoberto, se necessário. Mas suponho que posso apenas converter todos eles. Nenhum dano será causado se algum já estiver em UTF-8. Direita?
precisa saber é o seguinte
Não é um problema não :) Basta usar um caractere curinga
Rinzwind 26/01

Respostas:

26

Você não consegue descobrir automaticamente se um arquivo foi gravado com a codificação X originalmente.

O que você pode fazer com facilidade é verificar se o arquivo completo pode ser decodificado com êxito de alguma forma (mas não necessariamente corretamente) usando um codec específico. Se você encontrar bytes inválidos para uma determinada codificação, deve ser outra coisa.

O problema é que muitos codecs são semelhantes e têm os mesmos "padrões de bytes válidos", apenas interpretando-os como caracteres diferentes. Por exemplo, uma äcodificação em uma pode corresponder a éoutra ou a øuma terceira. O computador não pode realmente detectar qual maneira de interpretar o byte resulta em texto legível corretamente (a menos que talvez você adicione um dicionário para todos os tipos de idiomas e permita que ele execute verificações ortográficas ...). Você também deve saber que alguns conjuntos de caracteres são realmente subconjuntos de outros, como, por exemplo, a codificação ASCII faz parte dos codecs mais usados, como alguns da família ANSI ou UTF-8. Isso significa, por exemplo, que um texto salvo como UTF-8 que contém apenas caracteres latinos simples, seria idêntico ao mesmo arquivo salvo como ASCII.


No entanto, vamos voltar a explicar o que você não pode fazer com o que realmente pode fazer:

Para uma verificação básica nos arquivos de texto ASCII / não ASCII (normalmente UTF-8), você pode usar o filecomando Porém, ele não conhece muitos codecs e examina apenas os primeiros kB de um arquivo, assumindo que o restante não contenha novos caracteres. Por outro lado, também reconhece outros tipos de arquivos comuns, como vários scripts, documentos HTML / XML e muitos formatos de dados binários (o que é desinteressante para comparar arquivos de texto) e pode imprimir informações adicionais, se houver linhas extremamente longas ou o que tipo de sequência de nova linha (por exemplo, UNIX: LF, Windows: CR + LF) é usado.

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

Se isso não for suficiente, posso oferecer o script Python que escrevi para esta resposta aqui , que verifica os arquivos completos e tenta decodificá-los usando um conjunto de caracteres especificado. Se for bem-sucedida, essa codificação é um candidato em potencial. Caso contrário, se houver algum bytes que não possa ser decodificado com ele, você poderá remover esse conjunto de caracteres da sua lista.

Byte Commander
fonte
ANSI não é realmente o nome de nenhuma codificação de caracteres. Talvez você esteja pensando em códigos de escape ANSI, que podem ser expressos com a codificação de caracteres ASCII.
precisa saber é
@kasperd Provavelmente ele está se referindo a uma das famílias de páginas de código ISO 8859 ou Windows. Para desenvolvedores de janelas norte-americanos, a codificação ANSI geralmente significa a codificação do Windows 1252 por motivos históricos.
precisa saber é o seguinte
Sim, o ANSI é basicamente ASCII (códigos 0-127) mais uma página de códigos específica do código do idioma (códigos 128-255). Então você está certo ...
Byte Commander
Mais informações: O que é o formato ANSI?
21717 wjandrea
12

Um programa chamado filepode fazer isso. Exemplo:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

Se você estiver interessado em como isso é feito, consulte src/encoding.c.

Arkadiusz Drabczyk
fonte
2
Pode adivinhar , de qualquer maneira.
Hbbs
2
filefaz um palpite, e freqüentemente não é muito bom. Por exemplo, nos meus testes, ele identificou incorretamente o MacRoman e o CP-1252 como ISO-8859, com o resultado de que "š" e "ß" foram embaralhados.
Mark
Ótimo 👌! Passei algumas horas para encontrar a codificação correta do meu .sqlarquivo antigo e filemostrei ao meu que é realmente um gziparquivo compactado!
Amirreza Nasiri 21/11