Converter codificação de arquivo de texto

15

Frequentemente encontro arquivos de texto (como arquivos de legenda em meu idioma nativo, persa ) com problemas de codificação de caracteres. Esses arquivos são criados no Windows e salvos com uma codificação inadequada (parece ANSI), que parece sem sentido e ilegível, assim:

insira a descrição da imagem aqui

No Windows, é possível corrigir isso facilmente usando o Notepad ++ para converter a codificação em UTF-8, como abaixo:

insira a descrição da imagem aqui

E o resultado legível correto é assim:

insira a descrição da imagem aqui

Eu procurei muito por uma solução semelhante no GNU / Linux, mas infelizmente as soluções sugeridas (por exemplo, esta pergunta ) não funcionam. Acima de tudo, eu vi pessoas sugerem iconve recodemas eu não tive nenhuma sorte com essas ferramentas. Eu testei muitos comandos, incluindo os seguintes, e todos falharam:

$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt 

Nada disso funcionou!

Estou usando o Ubuntu-14.04 e estou procurando uma solução simples (GUI ou CLI) que funcione exatamente como o Notepad ++.

Um aspecto importante de ser "simples" é que o usuário não precisa determinar a codificação de origem; em vez disso, a codificação de origem deve ser detectada automaticamente pela ferramenta e apenas a codificação de destino deve ser fornecida pelo usuário. No entanto, também ficarei feliz em saber sobre uma solução funcional que requer que a codificação de origem seja fornecida.

Se alguém precisar de um caso de teste para examinar soluções diferentes, o exemplo acima pode ser acessado através deste link .

Seyed Mohammad
fonte
2
Tente: vim '+set fileencoding=utf-8' '+wq' file.txt.
Muru
Farsi deveria estar, iso-639mas isso não parece estar disponível em um iconvou em outro recode. Pelo menos, não vejo isso na saída de iconv -l.
terdon
@muru Testei sua sugestão, vimmas ela não funcionou.
Seyed Mohammad
@SeyedMohammad ainda parecia o mesmo?
Muru
@muru Yup! Nenhuma mudança.
Seyed Mohammad

Respostas:

12

Esses arquivos do Windows com texto em persa são codificados no Windows-1256 . Portanto, pode ser decifrado por comando semelhante ao OP experimentado, mas com conjuntos de caracteres diferentes. Nomeadamente:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(denunciado pelas reclamações do pôster original; ver comentários)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

Este assume que a variável de ambiente LANG está configurada para um código de idioma UTF-8. Para converter para qualquer codificação (UTF-8 ou outra), independentemente da localidade atual, pode-se dizer:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

O pôster original também é confundido com a semântica de ferramentas de recodificação de texto (recode, iconv). Para codificação de origem ( source.. ou -f), é necessário especificar a codificação com a qual o arquivo é salvo (pelo programa que o criou). Não há algumas suposições (ingênuas) baseadas em caracteres mojibake em programas que tentam (mas falham) lê-lo. Tentar o ISO-8859-15 ou o WINDOWS-1252 para um texto em persa era obviamente um impasse: essas codificações simplesmente não contêm nenhuma letra em persa.

Incnis Mrsi
fonte
@ Mohamed Mohamed: agora com comandos especificados explicitamente.
Incnis MRSI
Obrigado! O segundo comando (aquele usando iconv) funcionou. Mas o primeiro (usando recode) não funcionou corretamente e a saída ainda era sem sentido. Edite sua resposta para incluir apenas o iconvcomando e eu a marcarei como resposta.
Seyed Mohammad
1
Além de estar livre da configuração da variável LANG, pode-se fazer: o iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtque eu testei e trabalhei. Portanto, pode ser uma boa ideia editar seu comando assim.
Seyed Mohammad
Escrevi um script útil baseado no comando de trabalho que expliquei em outra resposta aqui. Espero que ajude outros usuários persas do Linux, pois isso me ajuda muito.
Seyed Mohammad
@karel: Obrigado, "reclamar" é um verbo - a frase foi escrita sem diagrama.
Incnis MRSI
1

Além disso iconv, que é uma ferramenta muito útil, por si só ou em um script, há uma solução realmente simples que achei tentando descobrir o mesmo problema para os conjuntos de caracteres gregos (Windows-1253 + ISO-8859-7).

Tudo que você precisa fazer é abrir o arquivo de texto na caixa de diálogo "Abrir" do Gedit e não clicando duas vezes nele . Na parte inferior da caixa de diálogo, há um menu suspenso para Codificação, definido como "Detectado automaticamente" . Altere para "Windows-125x" ou outro conjunto de códigos adequado e o texto ficará perfeitamente legível no Gedit. Você pode salvá-lo usando a codificação UTF-8, apenas para ter certeza de que não terá o mesmo problema novamente no futuro ...

Giorgos_tph
fonte
1

Como solução complementar para o problema, preparei um script Bash útil com base no iconvcomando da resposta de Incnis Mrsi :

#!/bin/bash

if [ $# -lt 1 ]
then
   echo 'Specify at least one file to fix.'
   exit 1
fi

# Temp file to store conversion attempt(s).
tmp='tmp.fixed'

for file in "$@"
do
  # Try to fix the file encoding.
  if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
    echo "Fixed: '$file'"
    cat $tmp > "$file"
  else
    echo "Failed to fix: '$file'"
  fi
done
rm $tmp

Salve este script como fix-encoding.sh, dê permissão para executar usando chmod +x fix-encoding.she use-o assim:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

Este script tentará corrigir a codificação de qualquer número de arquivos fornecidos como entrada. Observe que os arquivos serão corrigidos no local, portanto o conteúdo será substituído.

Seyed Mohammad
fonte
Você não precisa colocar $ file fora de "  ...  ", pois as variáveis ​​são expandidas entre aspas duplas e em texto aberto. Somente '$ file' será renderizado literalmente, com cifrão, por bash.
Incnis MRSI
Como mencionei em resposta à resposta postada por 'Incnis Mrsi', essa solução não funcionou e esse script também funciona.
Seyed Mohammad
1

Não sei se isso funciona com o Farsi: uso o Gedit, ocorre uma falha na codificação incorreta e posso escolher o que quero traduzir para UTF-8, era apenas um formato de texto sem iluminação, mas aqui está uma captura de tela !

insira a descrição da imagem aqui

Desculpe, finalmente cheguei aos meus arquivos de texto, agora eles estão todos convertidos.

Também adorei o bloco de notas ++, ainda sinto falta.

Ken Mollerup
fonte
O Gedit não pode corrigir o problema. Embora o Gedit não mostre um erro de codificação para o meu arquivo, mesmo quando não é possível corrigi-lo. Eu também tentei "salvar como" com a codificação UTF-8 no Gedit, mas isso não resolve o problema.
precisa saber é o seguinte
1

Se você gosta de trabalhar na GUI em vez da CLI, como eu:

  1. Abrir arquivo com Geany (editor)
  2. Vá para o menu Arquivo -> Recarregar como
  3. Escolha a codificação assumida para alterar os rabiscos em caracteres identificáveis ​​no seu idioma. Por exemplo, para ler subs gregos, eu recarregaria como Europa Ocidental -> grego (Windows-1253)
  4. Vá para o menu Documento > Definir codificação -> Unicode -> UTF-8
  5. Salve 
Christos
fonte
Não funciona ..
Aurimas
0

A solução que encontrei foi usar o editor de texto Microsoft Visual Studio Code , que é gratuito e está disponível para Linux.

Abra o arquivo que você deseja converter sua codificação no VS-Code. Na parte inferior da janela, existem alguns botões. Um deles está relacionado à codificação do arquivo, como mostrado abaixo:

insira a descrição da imagem aqui

Clicar neste botão exibe um menu superior que inclui dois itens. Nesse menu, selecione a opção "Reabrir com codificação", como abaixo:

insira a descrição da imagem aqui

Isso abrirá outro menu que inclui uma lista de codificação diferente, como mostrado abaixo. Agora selecione "Árabe (Windows 1256)":

insira a descrição da imagem aqui

Isso corrigirá o texto sem sentido como este:

insira a descrição da imagem aqui

Agora clique no botão de codificação novamente e desta vez selecione a opção "Salvar com codificação", como abaixo:

insira a descrição da imagem aqui

E no novo menu, selecione a opção "UTF-8":

insira a descrição da imagem aqui

Isso salvará o arquivo corrigido usando a codificação UTF-8:

insira a descrição da imagem aqui

Feito! :)

Seyed Mohammad
fonte
Tentou "Salvar com codificação' mas mostra codificação anterior agian, no meu caso sua UTF8
chaitanya