В таблице ASCII существует символ «J», который имеет кодовые точки в разных системах счисления:
Oct Dec Hex Char
112 74 4A J
Этот символ можно распечатать восьмеричным кодом, напечатав
printf '\112'
или echo $'\112'
. Как мне распечатать один и тот же символ в десятичной и шестнадцатеричной кодовой форме?
Ответы:
Hex:
Декабрь:
Альтернатива для hex :-)
источник
awk
.С
zsh
:Чтобы получить символ (в текущей кодировке) из кодовой точки Unicode:
источник
В общем, оболочка может понимать шестнадцатеричные, октальные и десятичные числа в переменных при условии, что они определены как
integers
:Или они являются результатом «арифметического расширения»:
Итак, вам просто нужен один способ напечатать символ, который принадлежит значению переменной.
Но вот два возможных пути:
Необходимы два printf: один для преобразования значения в шестнадцатеричную строку, а второй для фактической печати символа.
Второй выводит любую точку UNICODE (если ваша консоль установлена правильно).
Например:
Снежный человек.
Символ, который имеет представление utf-8 как
f0 9f 90 ae
есть0x1F42E
. Ищите,cow face site:fileformat.info
чтобы получить это :Примечание . Проблема, связанная со способом UNICODE, заключается в том, что для bash до версии 4.3 (исправлено в этой версии и выше) символы между точками UNICODE 128 и 255 (в десятичном формате) могут быть напечатаны неправильно.
Ссылки
Четвертый абзац внутри
PARAMETERS
вman bash
:Внутри "АРИФМЕТИЧЕСКАЯ ОЦЕНКА" в
man bash
:источник
é
(Octal: 351, Dec: 233, Hex: 0xE9) напечатан неправильно,printf '\351'
поскольку он печатает значение байта0xE9
всегда. Для терминала с кодировкойISO-8859-1
(и двоюродных братьев), который может работать, но в терминалах с кодировкой utf-8, значение байта0xE9
должно отображаться как . продолжение ....\u
(что происходит от zsh).Десятичная дробь:
Hex:
Функция может делать последовательности:
источник
Вы можете использовать библиотеку POSIX Awk stdlib :
источник
Если у вас есть список чисел для преобразования, и вы хотите избежать вызова функции и создания подоболочки для каждого символа, вы можете заранее определить набор ascii:
Обратите внимание, что нулевой символ исключен, поэтому каждый символ смещается на 1.
Затем используйте что-то вроде этого (предполагается, что 1 номер в строке):
источник
Вот все преобразования, использующие
printf
:источник