Ver pontos de código unicode para todas as letras no arquivo no bash

10

Eu tenho que lidar com um arquivo que tem muitos caracteres de controle invisíveis, como "da direita para a esquerda" ou "zero largura não-marceneiro", espaços diferentes do espaço normal e assim por diante, e eu tenho problemas para lidar com isso .

Agora, gostaria de ver de alguma forma todas as letras em um determinado arquivo, letra por letra (gostaria de dizer "da esquerda para a direita", mas infelizmente estou lidando com o idioma da direita para a esquerda) , como pontos de código unicode, usando apenas ferramentas bash básicas (como vi , less , cat ...). É possível de alguma forma?

Eu sei que posso exibir o arquivo em hexadecimal por hexdump , mas eu teria que recomputar os codepoints. Eu realmente quero ver os códigos de código unicode reais, para que eu possa pesquisar no Google e descobrir o que está acontecendo.

edit: Eu adicionarei que não quero transcodificá-lo para codificação diferente (porque é isso que eu estou descobrindo online). Eu tenho o arquivo em UTF8 e está tudo bem. Eu só quero saber os pontos exatos de todas as letras.

    
por Karel Bílek 12.01.2012 / 23:00

3 respostas

4

Eu escrevi para mim um perl one-liner, que faz exatamente isso, e também imprime o caractere original. (Espera o arquivo de STDIN)

perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'

No entanto, deve haver uma maneira melhor do que isso.

    
por 12.01.2012 / 23:38
3

Eu precisava do ponto de código para alguns smileys comuns e descobri o seguinte:

echo -n "                                    
por 30.12.2015 / 19:38
2

Inspirado pela resposta da Neftas , aqui está uma solução um pouco mais simples que funciona com strings, ao invés de um único char:

iconv -f utf8 -t utf32le | hexdump -v -e '8/4 "0x%04x " "\n"' | sed -re"s/0x /   /g"
#                                         ^
# The number '8' above determines the number of columns in the output. Modify as needed.

Também fiz um script Bash que lê stdin ou de um arquivo e exibe o texto original junto com os valores unicode:

COLWIDTH=8
SHOWTEXT=true

tmpfile=$(mktemp)
cp "${1:-/dev/stdin}" "$tmpfile"
left=$(set -o pipefail; iconv -f utf8 -t utf32le "$tmpfile" | hexdump -v -e $COLWIDTH'/4 "0x%05x " "\n"' | sed -re"s/0x /   /g")


if [ $? -gt 0 ]; then
    echo "ERROR: Could not convert input" >&2
elif $SHOWTEXT; then
    right=$(tr [:space:] . < "$tmpfile" | sed -re "s/.{$COLWIDTH}/|&|\n/g" | sed -re "s/^.{1,$((COLWIDTH+1))}\$/|&|/g")
    pr -mts" " <(echo "$left") <(echo "$right")
else
    echo "$left"
fi


rm "$tmpfile"

    
por 18.05.2017 / 14:12

Tags