Lihat titik kode unicode untuk semua huruf dalam file di bash

10

Saya harus berurusan dengan file yang memiliki banyak karakter kontrol tidak terlihat, seperti "kanan ke kiri" atau "nol lebar non-joiner", ruang yang berbeda dari ruang normal dan sebagainya, dan saya memiliki masalah berurusan dengan itu.

Sekarang, saya ingin entah bagaimana melihat semua huruf dalam file yang diberikan, huruf demi huruf (saya ingin mengatakan "kiri ke kanan", tetapi saya sayangnya berurusan dengan bahasa kanan-ke-kiri) , sebagai codepoint unicode, hanya menggunakan alat pesta dasar (seperti vi, less, cat...). Apakah mungkin?

Saya tahu saya dapat menampilkan file dalam heksadesimal oleh hexdump, tetapi saya harus menghitung ulang codepoints. Saya benar-benar ingin melihat codepoint unicode yang sebenarnya, jadi saya bisa google mereka dan mencari tahu apa yang terjadi.

sunting: Saya akan menambahkan bahwa saya tidak ingin transcode ke pengkodean yang berbeda (karena itulah yang saya temukan online). Saya punya file di UTF8 dan itu bagus. Saya hanya ingin tahu codepoint persis semua surat.

Karel Bílek
sumber

Jawaban:

5

Saya menulis sendiri perl satu-liner, yang melakukan hal itu, dan juga mencetak karakter asli. (Itu mengharapkan file dari STDIN)

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

Namun, harus ada cara yang lebih baik dari ini.

Karel Bílek
sumber
4

Saya membutuhkan titik kode untuk beberapa smiley umum, dan muncul dengan ini:

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

yang mencetak

U+1F60A

yang merupakan titik kode untuk "SMILING FACE WITH SMILING EYES" .

Stefan van den Akker
sumber
2

Terinspirasi oleh jawaban Neftas , berikut adalah solusi yang sedikit lebih sederhana yang bekerja dengan string, daripada satu karakter:

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.

Saya juga membuat skrip Bash yang membaca dari stdin, atau dari file, dan yang menampilkan teks asli bersama dengan nilai-nilai 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"

Output sampel

ThomasR
sumber