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

10

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

Agora, gostaria de visualizar de alguma forma todas as letras em um determinado arquivo, letra por letra (eu 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 básicas bash (como vi, less, cat...). É possível de alguma forma?

Eu sei que posso exibir o arquivo em hexadecimal por hexdump, mas eu teria que recalcular os pontos de código. Eu realmente quero ver os pontos de código unicode reais, para que eu possa pesquisá-los no Google e descobrir o que está acontecendo.

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

Karel Bílek
fonte

Respostas:

5

Eu mesmo escrevi uma linha de código perl, que faz exatamente isso, e também imprime o personagem original. (Ele espera o arquivo do STDIN)

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

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

Karel Bílek
fonte
4

Eu precisava do ponto de código para alguns smileys comuns e vim com isso:

echo -n "😊" |              # -n ignore trailing newline                     \
iconv -f utf8 -t utf32be |  # UTF-32 big-endian happens to be the code point \
xxd -p |                    # -p just give me the plain hex                  \
sed -r 's/^0+/0x/' |        # remove leading 0's, replace with 0x            \
xargs printf 'U+%04X\n'     # pretty print the code point

que imprime

U+1F60A

que é o ponto de código para "SORRISO COM OLHOS SORRISOS" .

Stefan van den Akker
fonte
2

Inspirada na resposta de Neftas , aqui está uma solução um pouco mais simples que funciona com strings, em vez de um único caractere:

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 criei 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"

Saída de amostra

ThomasR
fonte