Como reconhecer qual caractere ASCII em hexadecimal é esse?

1

Temos um arquivo de texto que queremos apagar de caracteres "ruins". Se abrirmos com vim (com ": set number"):

57000044 zo¥<9a>¥ge¥o¥graph¥i¥cal¥ly
39999999 pariá¹<83>Å<9b>a

O ex .: "< 9a >" e "< 83 >" e "< 9b >" está marcado em azul no vim e essas duas linhas ficam assim fora do vim:

$ sed '57000044,57000044!d' toclean.txt
zo���ge�o�graph�i�cal�ly
$ sed '57000044,57000044!d' toclean.txt | cat -vte -
zoM-%M-^ZM-%geM-%oM-%graphM-%iM-%calM-%ly$
$ 

e

$ sed '39999999,39999999!d' toclean.txt
pariṃśa
$ sed '39999999,39999999!d' toclean.txt | cat -vte -
pariM-aM-9M-^CM-EM-^[a$
$ 

Pergunta: Como descobrimos que o que é o caractere HEX ASCII para o mencionado "< 9a >" e "< 83 >" e "< 9b >" Ou "¹" ou "¥" ...

O código hexadecimal é necessário para remover tudo do arquivo para torná-lo mais limpo. Exemplo este código remove HEX ASCII "x09", então o "Guia Horizontal":

sed -i 's/[\x09]//g' toclean.txt

Nós tentamos usar "9A" ou "A5" em hexadecimal, isso não ajudou ..

$ sed '57000044,57000044!d' toclean.txt | sed 's/[\x9A]//g; s/[\xA5]//g'
zo���ge�o�graph�i�cal�ly
zo���ge�o�graph�i�cal�ly
$ 
    
por freaking-good-question 03.04.2015 / 08:23

4 respostas

1

Os códigos hexadecimais: < 9a > e hex: < 83 > não são códigos ASCII (os códigos ASCII vão apenas de < 00 > para < 7F >). Você também não pode "descobrir" quais caracteres (de qualquer conjunto de caracteres maiores que ASCII) estão associados a esses códigos, pois isso depende da codificação do conjunto de caracteres subjacente ("página de códigos"). Então você tem que perguntar àquele que criou os dados que codificação de caracteres ele usou. (Codificações típicas que você encontra frequentemente são ISO 8859-1, ISO 8859-15, UTF-8, UCS-2. Você também pode inspecionar as tabelas de códigos que você encontra na rede que caracteres com esses índices fazem mais sentido em seu contexto de dados .)

Depois de conhecer os valores dos códigos que você deseja remover, você pode (por exemplo) usar o comando tr com a opção -d (argumentos em octal).

    
por 03.04.2015 / 08:49
1

ASCII é um conjunto de caracteres de 7 bits. Caracteres com valores acima de 128 são caracteres não-ASCII.

Se você usar Unicode , observe que um caractere é representado por vários bytes (existem apenas 256 valores de bytes diferentes, mas mais de 100000 caracteres Unicode). A representação padrão de fato do Unicode é UTF-8 usa um número variável de bytes por caractere; Caracteres ASCII são representados por um único byte, outros por 2 a 4 bytes.

O Vim exibe alguns caracteres com marcadores de posição azuis, como <9a> , porque esses são bytes que não fazem parte de uma representação de caractere válida no conjunto de caracteres especificado pelo atual locale .

Se você quiser trabalhar em bytes, defina a configuração de localidade LC_CTYPE para C .

LC_CTYPE=C vim toclean.txt

Se você quiser trabalhar em UTF-8, execute o Vim em um terminal Unicode.

Você pode exibir os bytes no arquivo com um comando como od (POSIX) ou < href="http://linux.die.net/man/1/hexdump"> hexdump (BSD, geralmente encontrado no Linux).

od -t x1 toclean.txt
hexdump -C toclean.txt
hd toclean.txt

Se você determinou que deseja remover determinados valores de bytes, use tr .

LC_CTYPE=C tr -d '\x83\xa5' toclean.txt >clean.txt

Se você determinou que deseja remover determinados caracteres UTF-8, use tr em uma localidade com a codificação UTF-8, por exemplo,

LC_CTYPE=en_US.utf8 tr -d '¥' toclean.txt >clean.txt
    
por 04.04.2015 / 03:12
1

A solução mais simples que consegui encontrar para remover caracteres "não-ascii" de um arquivo de texto era de este tópico .

$ tr -cd '%bl0ck_qu0te%0-7' < dirtyfile > cleanfile

O '\ 000- \ 777' define o ascii definido em octal. "-c" é o complemento do conjunto dado, também conhecido como "não ascii" e "-d" exclui caracteres.

    
por 05.04.2015 / 00:34
0

Você pode usar apenas luit . Seu objetivo é limpar o texto do terminal para adequar-se à codificação do sistema e agir como um filtro transparente entre os aplicativos que manipulam incorretamente unicode e terminais - ou o contrário.

Você quase certamente já o instalou - ele é fornecido como padrão com X , porque xterm o chama automaticamente se detectar problemas de codificação em seu host.

Sua página man descreve este exemplo para interação com Emacs :

  • luit também é útil em aplicativos que codificam uma codificação diferente da normalmente usada no sistema ou que desejam usar sequências de escape herdadas para saída multilíngüe. Em particular, versões de Emacs que não falam bem em UTF-8 podem usar luit para saída multilíngue:

    $ luit -encoding 'ISO 8859-1' emacs -nw
    
  • E, em Emacs

     M-x      set-terminal-coding-system      RET
     iso-2022-8bit-ss2 RET
    

Além de suas aplicações de terminal direto, ele também suporta ...

-c     Function as a simple converter from standard
       input to standard output.

E assim pode ser usado como ...

luit -c <infile >outfile
    
por 04.04.2015 / 07:43