Como converter um arquivo de texto com mistura de codificações em uma única codificação?

Como converter um arquivo de texto com mistura de codificações em uma única codificação?
  1. Criei um arquivo de texto copiando suas diferentes partes de diferentes fontes (páginas da web, outros arquivos de texto, arquivos PDF) para o gedit e salvando-o no arquivo. Acho que é por isso que tenho várias codificações no arquivo de texto, mas não tenho certeza. Como posso evitar a criação de um arquivo de texto com codificações mistas, copiando suas diferentes partes de diferentes fontes para o gedit?
  2. Sempre que abro o arquivo no gedit, o gedit pode mostrar ou decodificar cada parte do texto corretamente. Parece que o gedit pode lidar com um arquivo de texto com codificações mistas, mas não tenho certeza.

    Mas quando eu abrir o arquivo no emacs, haverá caracteres que não poderão ser mostrados corretamente. (Não sei por que o emacs não pode fazer isso.) Então, gostaria de converter o arquivo de codificações mistas para uma codificação única, como utf-8.

    Como acho que o gedit pode detectar as codificações corretas para diferentes partes do arquivo de texto, e não sei se existem outros aplicativos que podem fazer isso, seria possível pedir ao gedit para converter o arquivo para utf-8, ou pelo menos me diga qual codificação ele encontra para qual parte do arquivo?

Obrigado.

Responder1

Hmmm... o conceito de um arquivo com várias codificações é um tanto vacilante, para ser honesto. Se você tiver um pouco de tempo,Este artigo(eEste) vale a pena ler.

Para Linux, um arquivo é uma sequência de bytes. Se você pedir a um programa para interpretá-lo como um arquivo de texto, ele fará isso usando um mapeamento entre bytes e caracteres; esse mapeamento é a codificação. Quase todos os editores de texto que conheço (não processadores de texto!) apenas entendem o conceito de uma codificação para um arquivo.

Eu não sou especialista em gedit; talvez esteja fazendo alguma mágica, como tentar detectar automaticamente a codificação linha por linha ou bloco de texto por bloco de texto... se for o caso, você pode tentar fazer o mesmo usandoenca(1):

 while read line; do echo $line | enconv -L none -x utf8; done < text.mixed > text.utf8

... mas depende de quão bom é enca em adivinhar sua codificação (funciona quase bem com o Leste Europeu, mas não com Latin1, por exemplo).

(1) Está nos repositórios, basta instalá-lo com sudo apt-get enca.

Responder2

Eu tive o mesmo problema e resolvi com o Emacs. A solução é citada emaqui:

Outra solução possível é marcar cada região que aparece com caracteres chineses e recodificá-la com Mx recode-region, fornecendo "O texto estava realmente em" como utf-16-le e "Mas foi interpretado como" como utf-16-be.

Outra é dividir as duas partes que possuem codificações diferentes, copiá-las em arquivos diferentes, converter a codificação de uma e adicioná-la à outra. No meu caso, isso funcionou com o Atom, mas não com o Notepad++ (utf16-le/be).

informação relacionada