Ich habe mir einen Perl-Einzeiler geschrieben, der genau das tut, und der auch den ursprünglichen Charakter druckt. (Es erwartet die Datei von STDIN)
perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'
Es sollte jedoch einen besseren Weg als diesen geben.
Ich brauchte den Codepunkt für einige gängige Smileys und kam auf 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
die druckt
U+1F60A
das ist der Codepunkt für "SMILING FACE WITH SMILING EYES".
Inspiriert von der Antwort von Neftas ist hier eine etwas einfachere Lösung, die mit Zeichenfolgen statt 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 aus 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"