Привет. Много вопросов поступило про ASCII после моего демонического поста. Этот пост будет не лучше, крепись
Конкретно есть интерес — как можно переводить и узнавать номера символов в различных системах счисления.
Ну смотри, давай выведем значения номеров символа английского алфавита в кодировке ASCII (шестнадцатеричные, восьмеричные, десятичные). Возьмем за эталон символ «S».
В bash это можно провернуть таким способом:
printf 'Hex : %x Oct : %o Dec : %d\n' "'"S{,,}
printf 'Hex : %x Oct : %o Dec : %d\n' '"'S{,,}
printf 'Hex : %x Oct : %o Dec : %d\n' \'S{,,}
printf 'Hex : %x Oct : %o Dec : %d\n' \"S{,,}
Получим:
Hex : 53 Oct : 123 Dec : 83
Это специальный синтаксис команды printf. Если перед символом «S» идет одинарная кавычка, или двойная кавычка, то значение будет номером символа.
Такой синтаксис появился в bash с версии 2.05a. Added support for builtin printf “’” flag character as per latest POSIX drafts.
Аналогично можно узнать номер символа в многобайтовой кодировке UTF-8. Например, так:
printf 'Hex : %x Oct : %o Dec : %d\n' '"'Я{,,}
На всю эту чачу влияют переменные окружения LC_CTYPE и LC_ALL. Ща покажу. Запускаем такое:
( LC_ALL=C ; chunks="Сёма" ; echo ${chunks:0:1}${chunks:3} )
Кодировка сломалась, на экран вывелось «Бма». Мы получили доступ к байтам, а не к символам UTF-8 кодировки. Второй байт символа «С» отправляется на помойку и аналогично первый «ё». По итогу вместо «Сёма» мы получили «Бма».
Если интересно глубже погрузиться в весь этот 3.14здец UTF-8, можешь прочитать эту замечательную статью.
echo bashdays{,,,}
На выходе получим 4 раза слово bashdays. Ничего сложного. Бери на заметку, хак полезный.
А еще команда printf, позволяет присвоить результат переменной. Делается это так:
printf -v var 'Hex : %x Oct : %o Dec : %d\n' '"'Ж{,,}
echo "$var"
Пока на этом всё. Больше не смею тебя мучить этими ужасными вещами! Увидимся завтра.








Комментарии