Como recodifico um arquivo de texto codificado misto

6

Eu tenho um arquivo de log que é ASCII, exceto por alguns caracteres UTF-8 (que eu posso corrigir para uma versão futura).

Por enquanto, eu preciso descobrir como colocar esse arquivo em um estado visível / pesquisável / editável por gedit / less etc.

enca -L none file retorna 7bit ASCII characters Surrounded by/intermixed with non-text data .

enconv -L none -X ASCII file e enconv -L none -X UTF-8 file "têm sucesso", mas na verdade não alteram nada.

Como faço para corrigir esse arquivo?

Atualizar (depois de algumas respostas):

Na verdade, como indicado abaixo (upvotes para todos :)), ASCII + UTF-8 é UTF-8. O que eu tenho é

0003bbc0  28 4c 6f 61 64 65 72 29  20 50 61 74 69 65 6e 74  |(Loader) Patient|
0003bbd0  20 00 5a 00 5a 00 5a 00  38 00 31 00 30 00 34 00  | .Z.Z.Z.8.1.0.4.|
0003bbe0  20 6e 6f 74 20 66 6f 75  6e 64 20 69 6e 20 64 61  | not found in da|
0003bbf0  74 61 62 61 73 65 0d 0a  32 36 20 53 65 70 20 32  |tabase..26 Sep 2|

Eu acredito que será um uma codificação do tipo cp1252 . Na verdade, eu não sei o que é o cp1252 será um 1 byte para ASCII, não é?

Aliás, o fato de que o linux vomita isso me ajudou a descobrir que um arquivo de entrada (de onde veio o id) estava mal codificado ...

    
por Stephen 25.10.2011 / 01:57

4 respostas

2

O que você tem é na verdade ASCII (em sua codificação usual em bytes de 8 bits) com um pouco de UCS-2 (Unicode restrito ao plano básico (BMP), onde cada caractere é codificado como dois bytes de 8 bits), ou talvez UTF-16 (uma extensão do UCS-2 que pode codificar todo o Unicode usando uma codificação de várias palavras para pontos de código acima de U + D7FF).

Eu duvido que você encontre uma ferramenta que possa lidar com uma mistura tão profana fora da caixa. Não há como decodificar o arquivo com generalidade total. No seu caso, o que provavelmente aconteceu é que alguns dados ASCII foram codificados em UTF-16 em algum momento (o Windows e o Java gostam de UTF-16; eles são praticamente desconhecidos no mundo unix). Se você partir do pressuposto de que os dados originais eram todos ASCII, você pode recuperar um arquivo utilizável retirando todos os bytes nulos.

<bizarre tr -d '
<bizarre tr -d '%pre%0' >ascii
0' >ascii
    
por 27.10.2011 / 00:47
4

Um arquivo que é "ASCII, exceto alguns caracteres UTF-8" é, bem, simplesmente um arquivo UTF-8.

É visível / pesquisável / editável desde que você esteja usando uma localidade UTF-8.

Você não pode convertê-lo para ascii, já que este último não possui uma representação equivalente para seus caracteres especiais UTF-8.

Você pode querer converter para Isolatin com

iconv -f UTF-8 -t ISO-8859-1
    
por 25.10.2011 / 02:10
2

Se você tiver um arquivo que contenha ASCII com alguns caracteres UTF-8, ele será, por definição, um arquivo UTF-8. Um arquivo ASCII puro também é válido UTF-8.

Parece que o que você tem é uma mistura de ASCII, UTF-8 e alguma outra codificação de byte único como o Latin-1. Isso é difícil de limpar. Mas é difícil dar bons conselhos sem saber o que o arquivo realmente contém. Tente postar a saída de hexdump -C file (reduzindo-a para algumas linhas que contenham caracteres com problema).

    
por 25.10.2011 / 02:09
1

Experimente chardet do pacote python-chardet - Experimentei agora em um arquivo que enca não conseguiu reconhecer ... chardet detectou um tipo de conjunto de caracteres. (de acordo com o man-page, encaixe significa Extremely Naive Charset Analyze :)

Se você não consegue detectar o tipo, então a re-codificação é inútil, já que o reencoder precisa saber o formato de entrada (veja Detectando conjuntos de caracteres , abaixo)

Você pode tentar abrir o arquivo em outro editor de texto, por exemplo. emacs , vim , jedit , etc.

gedit tem uma opção Choose / Add / Remove, na caixa de diálogo File Open. Você pode escolher / adicionar conjuntos de caracteres à lista de conjuntos de caracteres (depois de saber o que é). gedit apenas abre os tipos mostrados nessa lista.

Além disso, pode ser um arquivo do processador de texto. Tente abri-lo com o OpenOffice.org.

Outra opção (desesperada (?) é para o usuário strings .
strings imprimirá as seqüências de caracteres imprimíveis em arquivos.

Detectar conjuntos de caracteres está repleto de problemas. Para as muitas linguagens baseadas em scripts latinos (o que parece ser seu), existem muitas variações de conjuntos de caracteres. O único tema comum para esses conjuntos de caracteres é o conjunto de caracteres ASCII de 7 bits da linha de base que consiste em 128 possibilidades para hexadecimal \ x00 a \ x7F.

Qualquer um dos muitos conjuntos de caracteres de byte único que utiliza o 8º bit (mais 128 letras) usa este intervalo superior de tantas maneiras diferentes quanto os charset. .

A menos que você saiba qual é a codificação, muitas vezes é um jogo de probabilidade estatística detectá-la (engenharia reversa), porque o programa de detecção não tem idéia do que letra está olhando; só vê valores de byte. Quando nenhuma diferença única de definição é detectada (não é uma tarefa simples), o único recurso é escolher o conjunto de caracteres mais usado que combina.

O resultado é que mesmo que o arquivo contenha um charset A completamente válido, ele pode parecer tão válido para um programa de detecção quanto o charset B ... Esta é a razão pela qual um precisa saber o codificador de caracteres! - especialmente para conjuntos de caracteres que usam apenas um byte.

O conjunto de caracteres multibyte tem uma impressão digital muito mais óbvia , mas mesmo assim, se o conjunto de amostras não for grande o suficiente, é novamente um jogo de adivinhação ...

    
por 25.10.2011 / 04:06