Привет. Много вопросов поступило про 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, можешь прочитать эту замечательную статью.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Так, опять от темы ушли. Наверняка тебя интересует, что означает конструкция {,,}. Это бородатый хак, который дублирует строки.
echo bashdays{,,,}

На выходе получим 4 раза слово bashdays. Ничего сложного. Бери на заметку, хак полезный.

А еще команда printf, позволяет присвоить результат переменной. Делается это так:

printf -v var 'Hex : %x Oct : %o Dec : %d\n' '"'Ж{,,}
echo "$var"

Пока на этом всё. Больше не смею тебя мучить этими ужасными вещами! Увидимся завтра.