LINUX.ORG.RU
ФорумAdmin

Как вывести псевдографику в консоли используя десятичные коды?

 ,


0

1

Howdy!

Как по кодам в консоли вывести символы псевдографики кроме как?
echo -e "\xe2\x96\x93"

Хочу использовать для вывода конструкцию цикла а ля:
for x in {1..255};do echo -e "\xe2\x96"$x;done
Однако $x десятичное, а а я не нашёл ни как представить его в hex, ни как вывести символ unicode десятичным кодом.

Нашёл только, как символ разложить в unicode \xe2\x96\x93
echo -n "▓" | od -A n -t x1 |sed 's/ /\\x/g'

Таблица псевдографики:
http://pascalguru.ru/psevdograf.html
https://ru.wikipedia.org/wiki/Псевдографика

man ncurses man terminfo man termcap — читал, но видимо упустил. Видимо надо читать https://www.opennet.ru/docs/RUS/bash_scripting_guide/ но глаза уже в кучу.

★★★

Последнее исправление: hikikomori (всего исправлений: 2)

Предствить в hex можно с так:

$ printf %x 100
64

Соответственно, твой код будет выглядеть так:

$ for X in {32..128}; do echo -e "\x$(printf %x $X)" ; done

!
"
#
$
%
&
...
Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

Спасибо товарищ! Вы мне этим решением с printf помогли в другом вопросе с принтером - printf "\x1b\x6a\x23" | lpr -l печати на принтере без перевода ПГ. Но алфавит и так можно вывести for i in {a..z}; do echo -n $i; done а мне нужны именно символы псевдографики. Допустим «░▒▓» я вывел так: for X in {91..93}; do printf "\xe2\x96\x$(printf $X)" ; done ;echo А вот как вывести рамки? Допустим делаю так:

for x in {128..172}; do printf "\xe2\x95\x$(printf %x $x)" ; done ;echo


На экране видно, но если попробовать отправить на принтер, то...

echo $(for x in {128..172}; do printf "\xe2\x95\x$(printf %x $x)" ; done ;) | iconv -t CP866 | lpr -l
iconv: недопустимая входная последовательность в позиции 0
lpr: Нет файла в запросе на печать.


В echo $() после неудачи попробовал обернуть, но не помогло.

А просто символами печатает:
echo "░▒▓" | iconv -t CP866 | lpr -l

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Ответ на: комментарий от hikikomori

Если тебе нужна CP866, почему бы тебе сразу не генерить символы в этой кодировке?

Здесь на картинке список кодов: https://en.wikipedia.org/wiki/Code_page_866

Псевдографика находится в промежутке 0xB0…0xDF.

Но получается, что теперь чтобы тебе вывести на экран нужно делать iconv, а чтобы послать на принтер - не нужно.

И еще мне непонятно зачем ты в начало ставишь \xe2\x95.

Вот вывод на экран, в двух вариантах задания диапазона:

$ echo $(for x in {176..223};                     do printf "\x$(printf %x $x)" ; done ;) | iconv -f CP866
░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀

$ echo $(for x in $( seq $((16#B0)) $((16#DF)) ); do printf "\x$(printf %x $x)" ; done ;) | iconv -f CP866
░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀

А вот с принтером:

$ echo $(for x in {176..223};                     do printf "\x$(printf %x $x)" ; done ;) | lpr -l
$ echo $(for x in $( seq $((16#B0)) $((16#DF)) ); do printf "\x$(printf %x $x)" ; done ;) | lpr -l
Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Если тебе нужна CP866, почему бы тебе сразу не генерить символы в этой кодировке?

Тогда вывод делается узкоспециальным - для консоли придётся конвертировать обратно в utf8.

Но получается, что теперь чтобы тебе вывести на экран нужно делать iconv, а чтобы послать на принтер - не нужно./quote]
Вот-вот!

И еще мне непонятно зачем ты в начало ставишь \xe2\x95.

Вероятно я не очень понял принцип. Без этих двух кодов ничего не печатается в конструкции echo $(for x in {128..172}; do printf "\xe2\x95\x$(printf %x $x)" ; done ;)

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Ответ на: комментарий от Kroz

Что-то не пойму, а как из массива bash выводить символы побуквенно?

line="Wake up, User, The Windows has you..."; len=${#line}; for x in $line; do printf $x |lpr -l ; len=$(($len+1)); sleep 0.5 ;done;


Так глотает пробелы. И кажется коряво я написал. Думал прямо в цикле описать $line, но тогда не смог бы до цикла подсчитать её длину. Не знаю, как в баше...

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

Что-то не пойму, а как из массива bash выводить символы побуквенно? line=«Wake up, User, The Windows has you…»; len=${#line}; for x in $line; do printf $x |lpr -l ; len=$(($len+1)); sleep 0.5 ;done; Так глотает пробелы. И кажется коряво я написал. Думал прямо в цикле описать $line, но тогда не смог бы до цикла подсчитать её длину. Не знаю, как в баше…

А всё остальное устраивает?

Твой код выводит строку по словам. Может тебе не нужно побуквенно ;).

Какую задачу ты решаешь?

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Всё подходит, спасибо!
Вы спросили почему я там лишние коды вводил, я ответил.

hikikomori ★★★
() автор топика
Ответ на: комментарий от Kroz

Имитация печатной машинки. Печать на матричном принтере побуквенно с задержкой. В цикле за раз печатается один символ из массива.

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Ответ на: комментарий от hikikomori

Имитация печатной машинки

Очень рекомендую скачать «Архив руководства в html-формате (~380Кб)» отсюда: https://www.opennet.ru/docs/RUS/bash_scripting_guide и прочитать главу «9.2. Работа со строками»

$ LINE="Wake up, User, The Windows has you..." ; while [[ -n "$LINE" ]] ; do echo -n "${LINE::1}" ; LINE="${LINE:1}" ; sleep 0.1; done ; echo
Kroz ★★★★★
()

Помню лет десять назад развлекался этим. Красил sh скрипты разноцветной фигней. ОНо Вам надо? Для вывода шелл в таблицах, сравнениях и пр. есть туча утилит. Которые идут в каждом дистри в комплекте sh.

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Ответ на: комментарий от Kroz

Спасибо, на экране прекрасно, но на принтер уходит почему-то всё разом. Пробовал после echo через пайп | plr -l

Mendel Cooper — bashе всё, но нет времени целиком его изучить. Пойду прочитаю 9.2 ;)

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.