Zeigen Sie Unicode-Codepunkte für alle Buchstaben in der Datei auf Bash an


10

Ich muss mich mit einer Datei befassen, die viele unsichtbare Steuerzeichen enthält, wie "von rechts nach links" oder "Nicht-Joiner ohne Breite", andere Leerzeichen als das normale Leerzeichen usw., und ich habe Probleme damit.

Jetzt möchte ich irgendwie alle Buchstaben in einer bestimmten Datei Buchstabe für Buchstabe (ich möchte "von links nach rechts" sagen, aber ich habe es leider mit der Sprache von rechts nach links zu tun) als Unicode-Codepunkte anzeigen und nur verwenden Grund bash - Tools (wie vi, less, cat...). Ist es irgendwie möglich?

Ich weiß, dass ich die Datei hexadezimal anzeigen kann hexdump, aber ich müsste die Codepunkte neu berechnen. Ich möchte wirklich die tatsächlichen Unicode-Codepunkte sehen, damit ich sie googeln und herausfinden kann, was passiert.

Bearbeiten: Ich werde hinzufügen, dass ich es nicht in eine andere Codierung umcodieren möchte (weil ich das online herausfinde). Ich habe die Datei in UTF8 und das ist in Ordnung. Ich möchte nur die genauen Codepunkte aller Buchstaben kennen.

Antworten:


5

Ich habe mir einen Perl-Einzeiler geschrieben, der genau das tut und der auch den Originalcharakter druckt. (Es erwartet die Datei von STDIN)

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

Es sollte jedoch einen besseren Weg geben.


4

Ich brauchte den Codepunkt für einige gängige Smileys und fand Folgendes:

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

welche druckt

U+1F60A

Dies ist der Codepunkt für "SMILING FACE WITH SMILING EYES" .


2

Inspiriert von Neftas 'Antwort ist hier eine etwas einfachere Lösung, die mit Zeichenfolgen anstatt mit einem einzelnen Zeichen funktioniert:

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.

Ich habe auch ein Bash-Skript erstellt, das aus stdin oder einer Datei liest und den Originaltext zusammen mit den Unicode-Werten anzeigt:

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"

Beispielausgabe

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.