Como converter arquivo unknown-8bit para utf8

6

Eu tenho um arquivo .srt que aparece como rabisco quando o abro no gEdit no Ubuntu. Então eu quero convertê-lo para utf8 para poder lê-lo.

Quando tento descobrir qual é a codificação:

file -i x.srt 
x.srt: text/plain; charset=unknown-8bit

Em outra tentativa, encontrei:

find .  -type f -print | xargs file
./x.srt:   Non-ISO extended-ASCII text, with CRLF line terminators

Também experimentei a enca:

enca x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use '-L language', or '-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run 'enca --list languages' to get a list of supported languages.

e

enca -L Persian  x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use '-L language', or '-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run 'enca --list languages' to get a list of supported languages.

Então estou querendo saber como conhecer a codificação e, eventualmente, convertê-la em um formato utilizável.

    
por supermario 12.02.2015 / 20:33

3 respostas

2

Não há uma maneira confiável de converter uma codificação desconhecida em uma conhecida.

No seu caso, se você sabe que o texto original está em farsi / persa, talvez seja possível identificar várias codificações possíveis e iterar sobre elas até ver a saída esperada.

Com base no googling rápido, não há um conversor padrão e estável para a codificação do Sistema Iraniano legado, e o único restante A alternativa popular é a página de códigos do Windows 1256 . Eu incluí MacArabic aqui principalmente para fins ilustrativos (embora talvez seja mesmo uma alternativa viável para o Farsi também?)

for encoding in cp1256 macarabic; do
    if iconv -f "$encoding" -t utf-8 inputfile >outputfile."$encoding"; then
        echo "$encoding: possible"
    else
        echo "$encoding: skipped"
        rm outputfile."$encoding"
    fi
done

(Minha versão do iconv não suporta realmente o MacArabic, mas talvez você tenha mais sorte; ou você pode tentar uma ferramenta de conversão diferente.)

Examine os arquivos de saída resultantes; veja se um deles parece fazer sentido.

Se você souber como deve ser a saída, também poderá procurar mapeamentos individuais para bytes no arquivo. Se o primeiro byte é 0x94 e você sabe que deve ser exibido como ﭖ você basicamente estabeleceu que a codificação é o Iran System. Talvez procure mais alguns bytes para verificar essa conclusão. A página da Wikipedia para esta codificação tem uma tabela com todos os caracteres. Obviamente, isso é meticuloso, lento e propenso a erros, especialmente se houver muitas codificações candidatas para escolher.

Para algumas codificações, você pode encontrar uma lista, por exemplo no link - para outros, talvez você só precise consultar as tabelas de codificação correspondentes da Wikipédia.

    
por 06.10.2015 / 08:09
1

talvez para inspecionar visualmente todas as ~ 1000 possibilidades de iconv, listando 20 primeiras linhas de cada um ... mesclado para o resultado all.txt.

#!/usr/bin/env bash
                      line=$(printf "=%.0s" {1..50})
for FMT in $(iconv -l); do    
                   echo "$line\nFormat $FMT:\n$line"
   iconv -f $FMT -t UTF8 < inputFile.srt | head -n20
done > all.txt

#gedit all.txt

... e descubra qual formato é o correto (se você puder reconhecer persa).

    
por 12.02.2015 / 22:18
1

Um arquivo em uma página de códigos desconhecida de 8 bits é determinado como "unknown-8bit" por um motivo: não é um problema fácil sem nenhuma idéia sobre o idioma. Não quer dizer que é impossível, mas, para trabalhar de forma eficiente, esse detector heurístico tinha que possuir um grande vocabulário de todas as linguagens mais usadas, uma grande lista de páginas de código e conhecer alguma gramática. Atualização: nunca tentei enca ; possivelmente é um decodificador maravilhoso feito ao longo dessas linhas. Mas se o arquivo representar, digamos, um código-fonte ASCII com apenas uma ou duas palavras feitas de octetos com alta definição de bits, é virtualmente impossível adivinhar o idioma e a codificação mesmo com esse algoritmo heurístico milagroso. É por isso que o HTTP / 1.1 original insistiu strongmente na declaração de charset no cabeçalho HTTP Content-Type: para qualquer tipo de mídia text/ *.

Então, a solução, por pontos:

  1. Investigue / aprenda / adivinhe qual idioma o arquivo supostamente codifica. Aqui uma inteligência humana é crucial. Pelo menos compile uma lista de poucas hipóteses plausíveis.
  2. Compile uma lista de codificações usadas pela (s) língua (s).
  3. Tente estas codificações: head arquivo |iconv -f try (a variável de ambiente LANG é assumida como definida para uma TUI usada) e veja se é o resultado legível, até o sucesso.

Esta solução, é claro, assume que o texto está codificado corretamente , mas em uma página de códigos desconhecida . Casos em que o texto foi distorcido por erro humano ou devido a uma falha no software não podem ser resolvidos dessa maneira.

Os pontos 2. e 3. podem ser automatizados e tais ferramentas existem, na verdade, mas são específicas do idioma (ou seja, um decodificador heurístico para russo não funcionará para japonês e vice-versa) ou, pelo menos, , para especificar o idioma de entrada (como enca ).

Quanto à linguagem persa, as codificações possíveis incluem o Windows-1256 (consulte este tópico ), ISO8859-6, e agora obsoleto codificação do sistema Iran . Seja feliz por não ter uma lista de pelo menos sete páginas de códigos usadas para russo (KOI7, KOI8, CP866, Windows-1251, ISO8859-5, MacCirúrgico, MIK).

    
por 05.09.2015 / 20:08