Перегляньте кодові точки unicode для всіх літер у файлі на bash


11

Я маю справу з файлом, який містить багато невидимих ​​символів управління, як-от "праворуч ліворуч" або "нульова ширина неприєднувача", інші пробіли, ніж звичайний простір тощо, і у мене виникають проблеми з цим.

Тепер я хотів би якось переглядати всі букви в заданому файлі, буква за буквою (я хотів би сказати "зліва направо", але я, на жаль, маю справу з мовою справа наліво) , як кодові точки unicode, використовуючи лише основні інструменти Баш (як vi, less, cat...). Чи можливо якось?

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

редагувати: Я додам, що я не хочу перекодувати його в інше кодування (тому що це я знаходжу в Інтернеті). У мене є файл в UTF8, і це добре. Я просто хочу знати точні кодові точки всіх букв.

Відповіді:


6

Я написав собі перламутровий однолінійковий текст, який робить саме це, і він також друкує оригінальний символ. (Очікує файл від 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

Натхненний відповіддю Нефтаса , ось дещо простіше рішення, яке працює з рядками, а не з одним символом:

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, який читає зі stdin або з файлу, і відображає оригінальний текст разом із значеннями 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"

Вибірка зразка

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.