Como alterar a codificação do texto ASCII estendido não ISO, com terminadores de linha CRLF para UTF-8?

21

Eu tenho um arquivo txt:

$ file -i x.txt
x.txt: text/plain; charset=unknown-8bit
$ file x.txt 
x.txt: Non-ISO extended-ASCII text, with CRLF line terminators

E existem alguns caracteres codificados incorretamente:

trwa³y, sta³y, usuwaæ

Como posso alterar a codificação deste arquivo para UTF-8? Eu tentei da seguinte maneira até agora:

$ iconv -f ASCII -t UTF-8 x.txt
                puiconv: illegal input sequence at position 4

Talvez eu devesse usar de alguma forma extended ASCII( high ASCII), mas não consigo encontrá-lo na iconvlista de codificação.

Patryk
fonte
2
você pode carregar o arquivo em algum lugar?
Janos
Há uma lista útil de codificações ISO de 8 bits, todas mostradas lado a lado, aqui . Algum deles parece próximo ao que você observa no seu arquivo? Por exemplo, se você acha que "sta³y" deve ser "stacy", encontre qual codificação tem um "c" para qualquer que seja o código hexadecimal estranho nessa palavra.
precisa saber é o seguinte
Provavelmente 90% das vezes, "Texto ASCII estendido não ISO" será um arquivo codificado na página de código do Windows 1252 . "É provavelmente a codificação de caracteres de 8 bits mais usada no mundo." (Wikipedia). Experimente primeiro:iconv -f windows-1252 -t utf-8 file
nyov 2/09

Respostas:

33

file informa "Texto ASCII estendido não ISO" porque detecta que isso é:

  • provavelmente um arquivo de "texto" devido à falta de caracteres de controle (valores de bytes 0 a 31) que não sejam quebras de linha;
  • “ASCII estendido” porque existem caracteres fora do intervalo ASCII (valores de bytes ≥128);
  • “Não ISO” porque existem caracteres no intervalo de 128 a 159 (a ISO 8859 reserva esse intervalo para caracteres de controle).

Você precisa descobrir em qual codificação esse arquivo parece estar. Você pode tentar o reconhecimento automático do Enca . Pode ser necessário movê-lo na direção certa, informando em que idioma o texto é.

enca x.txt
enca -L polish x.txt

Para converter o arquivo, passe a -xopção:enca -L polish x.txt -x utf8 >x.utf8.txt

Se você não pode ou não deseja usar o Enca, pode adivinhar a codificação manualmente. Um pouco de olhar ao redor me disse que este é um texto em polonês e as palavras são trwały, stały, usuważ, então estamos procurando uma tradução onde ³łe æż. Isto parece latino-2 ou latino-10 ou, mais provavelmente (dado “não-ISO” CP1250 que você está vendo como latin1 . Para converter o arquivo para UTF-8, você pode usar recode ou iconv .

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt
Gilles 'SO- parar de ser mau'
fonte
Eu não participo de < x.txt > x.utf8.txtPor que usamos <e depois >? Como funciona?
Filip Bartuzi
@FilipBartuzi <e >execute o redirecionamento de entrada e saída, respectivamente .
Gilles 'SO- stop be evil'
1

Abra o arquivo de texto com o gedit e, na caixa de diálogo "salvar como ...", você verá a codificação atual.

gedit
fonte
0

Você tentou descobrir qual codificação exata é x.txt? Você obterá uma lista de codificações suportadas com

iconv --list

Às vezes acontece que eu tenho uma incompatibilidade entre latin1 e utf8. Em seguida, geralmente ajuda a convertê-lo de e para o utf8 e vice-versa.


fonte
0

Eu criei um script de conversão automatizado usando a biblioteca de encaixe , eu o uso no NAS para converter legendas em UTF-8, mas ele pode ser utilizado para qualquer conversão automatizada

Sinta-se livre para usar :)

EDITAR:

#!/bin/bash
LANGUAGE=czech
TO=utf8
CONVERT="enca -L $LANGUAGE -x $TO"

# Find and onvert
find ./ -type f -name "*.srt" | while read fn; do
  IS_TARGET=`enca "${fn}" | egrep -ow -m 1 'UTF-8|Unrecognized|KOI8-CS2|7bit ASCII|UCS-2|Macintosh Central European'`

    if [ "$IS_TARGET" != "UTF-8" ] &&
       [ "$IS_TARGET" != "UCS-2" ] &&
       [ "$IS_TARGET" != "Macintosh Central European" ] &&
       [ "$IS_TARGET" != "Unrecognized" ] &&
       [ "$IS_TARGET" != "7bit ASCII" ] &&
       [ "$IS_TARGET" != "KOI8-CS2" ]; then

        echo "${fn} ---- Will be converted!"
    # optional backup of original srt
        # cp "${fn}" "${fn}.bak"
        $CONVERT "${fn}"
    fi  

done
Barlog951
fonte