Visualizza i punti di codice unicode per tutte le lettere nel file su bash


10

Ho a che fare con un file che ha molti caratteri di controllo invisibili, come "da destra a sinistra" o "non-joiner a larghezza zero", spazi diversi dallo spazio normale e così via, e ho problemi a gestirlo.

Ora, vorrei in qualche modo visualizzare tutte le lettere in un dato file, lettera per lettera (vorrei dire "da sinistra a destra", ma purtroppo mi occupo della lingua da destra a sinistra) , come punti di codice unicode, usando solo strumenti di bash di base (come vi, less, cat...). È possibile in qualche modo?

So che posso visualizzare il file in formato esadecimale hexdump, ma dovrei ricalcolare i punti di codice. Voglio davvero vedere i punti di codice Unicode attuali, quindi posso cercarli su Google e scoprire cosa sta succedendo.

modifica: aggiungerò che non voglio transcodificarlo in una codifica diversa (perché è quello che sto scoprendo online). Ho il file in UTF8 e va bene. Voglio solo conoscere i punti di codice esatti di tutte le lettere.

Risposte:


5

Mi sono scritto un perl one-liner, che fa proprio questo, e stampa anche il personaggio originale. (Si aspetta il file da STDIN)

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

Tuttavia, dovrebbe esserci un modo migliore di questo.


4

Avevo bisogno del punto di codice per alcune faccine comuni, e mi è venuto in mente questo:

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

quale stampa

U+1F60A

che è il punto di codice per "FACCIA SORRIDENTE CON GLI OCCHI SORRIDENTI" .


2

Ispirato dalla risposta di Neftas , ecco una soluzione leggermente più semplice che funziona con le stringhe, piuttosto che con un singolo carattere:

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.

Ho anche creato uno script Bash che legge da stdin o da un file e che visualizza il testo originale insieme ai valori 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"

Uscita campione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.