Просмотр кодовых точек Unicode для всех букв в файле на Bash

11

Мне приходится иметь дело с файлом, который имеет много невидимых управляющих символов, таких как «справа налево» или «не присоединяемый с нулевой шириной», пробелами, отличными от нормального пробела и т. Д., И у меня возникают проблемы с этим.

Теперь я хотел бы как-то просмотреть все буквы в данном файле, букву за буквой (я хотел бы сказать «слева направо», но я, к сожалению, имею дело с языком справа налево) , как кодовые точки Юникода, используя только основные инструменты Баш (как vi, less, cat...). Возможно ли это как-то?

Я знаю, что могу отобразить файл в шестнадцатеричном формате hexdump, но мне придется пересчитать кодовые точки. Я действительно хочу увидеть реальные кодовые точки Unicode, чтобы я мог найти их в Google и выяснить, что происходит.

редактировать: я добавлю, что я не хочу перекодировать его в другую кодировку (потому что это то, что я узнаю в Интернете). У меня есть файл в UTF8, и это нормально. Я просто хочу знать точные кодовые точки всех букв.

Карел Билек
источник

Ответы:

6

Я написал себе perl one-liner, который делает именно это, и он также печатает оригинальный символ. (Ожидается файл от STDIN)

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

Однако должен быть лучший способ, чем этот.

Карел Билек
источник
Да, это работает, и нам нужна эта команда
Ян Кинг Инь
5

Мне понадобился код для некоторых общих смайликов, и я придумал это:

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

какие отпечатки

U+1F60A

это кодовая точка для "УЛЫБАЮЩЕГО ЛИЦА С УЛЫБАЮЩИМИСЯ ГЛАЗАМИ" .

Стефан ван ден Аккер
источник
3

Вдохновленный ответом Neftas , вот несколько более простое решение, которое работает со строками, а не с одним символом:

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.

Я также создал скрипт Bash, который читает из стандартного ввода или из файла и отображает исходный текст вместе со значениями 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"

Образец вывода

ThomasR
источник