Como pesquisar e substituir caracteres duplos por caracteres únicos Unicode em um arquivo truncado?

3

Eu tenho um arquivo de texto muito longo em francês que preciso limpar. Os caracteres não ASCII foram substituídos pela combinação de caracteres ímpares. Como exemplo, o seguinte conteúdo:

passer de très bonnes fés de fin d'année.

deve se tornar: (como texto Unicode)

passer de très bonnes fêtes de fin d'année.

Eu tentei sed, mas não tive sucesso. Um amigo recomendou experimentar o Perl. Eu posso facilmente construir uma tabela com a estranha seqüência de caracteres e os corretos substitutos. Idealmente, eu preferiria que essa tabela fosse um arquivo independente para uso futuro. Qual é a abordagem recomendada para essas conversões?

    
por Yves 22.12.2014 / 17:53

2 respostas

2

Parece que você tinha o texto codificado em utf-8 (isso é bom, já que é o padrão para o Unix), mas algo o lê como o ISO 8859-1 / Microsoft® windows Latin-1 e depois saída é interpretação. Você precisa reverter isso.

por exemplo,

echo "passer de très bonnes fêtes de fin d'année" | iconv --to-code="ISO 8859-1"

Isso levará a codificação quebrada e a converterá em utf-8 válido. Se o seu sistema estiver configurado para utf-8, ele será lido corretamente.

Explicação: Se fizermos echo è | od -t x1 e echo ê | od -t x1 , então veremos que os códigos hexadecimais são c3 a8 0a e c3 aa 0a , então olhamos aqui link (estes são códigos iso 8859-1, não ascii) vemos que esses códigos dão è e ê ambos seguidos por um caractere invisível. Então agora sabemos o que deu errado: alguma coisa leu utf-8, mas interpretou como iso 8859-1. Então, precisamos agora revertê-lo: lemos em cada formato que estamos lendo e convertemos para iso 8859-1 (o inverso do que nos trouxe até aqui). O resultado é válido utf-8.

    
por 22.12.2014 / 18:48
0

O mojibake apresentado pelo autor original pode ter duas causas:

  1. O arquivo contém um texto em francês em UTF, mas o programa que mostra que ele usa erroneamente a codificação ISO8859-1 ou Windows-1252 (em vez de UTF-8).
  2. Dupla codificação : essencialmente a coisa contada por Richard.

As soluções são:

  1. Lido por um aplicativo com um código do idioma UTF-8.
  2. tente iconf -f UTF-8 -t Windows-1252 < garbage_file ou iconf -f UTF-8 -t ISO-8859-1 < garbage_file , esperando um texto UTF-8 significativo na saída.

É possível, no entanto, que o texto tenha sido mais danificado (para especialistas: por exemplo, U + 00C7 Ç, codificado como 37 , foi lido em ISO-8859-1 com um código de controle C1, que foi descartado ) e a conversão automática de volta não é mais possível. Então, sim, a pesquisa e a substituição automáticas (veja os comentários na resposta de richard) podem recuperar pelo menos alguns caracteres originais.

    
por 04.09.2015 / 22:30