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

11

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

    
por NonStandardModel 26.01.2017 / 20:20

2 respostas

16

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

O que você pode fazer facilmente é verificar se o arquivo completo pode ser decodificado com sucesso de alguma forma (mas não necessariamente corretamente) usando um codec específico. Se você encontrar algum byte que não seja válido para uma dada codificação, deve ser algo diferente.

O problema é que muitos codecs são semelhantes e possuem os mesmos "padrões de bytes válidos", apenas interpretando-os como caracteres diferentes. Por exemplo, um ä em uma codificação pode corresponder a é em outro ou ø em um terceiro. O computador não pode realmente detectar qual a maneira de interpretar o byte resulta em um texto legível corretamente humano (a não ser que talvez se você adicionar um dicionário para todos os tipos de idiomas e permitir que ele realize verificações ortográficas ...). Você também deve saber que alguns conjuntos de caracteres são, na verdade, subconjuntos de outros, como, por exemplo, A codificação ASCII é uma parte dos codecs mais usados, como alguns da família ANSI ou UTF-8. Isso significa, por exemplo, 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 você realmente pode fazer:

Para uma verificação básica em arquivos de texto ASCII / não-ASCII (normalmente UTF-8), você pode usar o comando file . Ele não conhece muitos codecs e examina apenas os primeiros kB de um arquivo, assumindo que o restante não conterá nenhum caractere novo. 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 não é interessante para comparar arquivos de texto) e pode imprimir informações adicionais se existem linhas extremamente longas ou tipo de seqüê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-lhe o script Python que escrevi para esta resposta aqui , que analisa completo arquivos e tenta decodificá-los usando um conjunto de caracteres especificado. Se tiver sucesso, essa codificação é um candidato em potencial. Caso contrário, se houver algum byte que não possa ser decodificado, você poderá remover esse conjunto de caracteres da sua lista.

    
por Byte Commander 26.01.2017 / 20:48
4

Um programa chamado file pode 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 saber como é feito, veja src/encoding.c .

    
por Arkadiusz Drabczyk 26.01.2017 / 20:42