Подтвердить что ты не робот

Рисование таблиц в терминале с использованием символов окна ANSI

Я пытаюсь напечатать таблицу, которая более приятна для глаз, чем чистое текстовое представление. в основном я хочу преобразовать что-то вроде этого:

+-----+--------+
| age | weight |
+-----+--------+
| 10  | 100    |
| 80  | 500    |
+-----+--------+

примерно так:

┌─────┬────────┐
| age | weight |
├─────┼────────┤
│ 10  │   100  │
│ 80  │  500   │
└─────┴────────┘

вот скриншот того, что я вижу в терминале:

in terminal looks like this

Обратите внимание на промежутки между строками. Моя проблема в том, что они не подключаются должным образом, в то время как другие инструменты Unix, которые используют печать ANSI, выглядят отлично в терминале. Например, дерево, если я запустил tree -A в моем терминале, я получаю следующее:

tree in terminal

Обратите внимание, что вертикальные линии соединены вместе. это смешно, потому что, когда я копирую и вставляю вывод дерева в свой текстовый редактор и запускаю свой script, я получаю что-то вроде этого:

tree in my code

Очевидно, я что-то пропустил для печати символов ANSI в терминале и не смог найти ничего об этом, отправив его в Google. может ли кто-нибудь пролить свет на эту тему?

4b9b3361

Ответ 1

Думаю, я должен ответить на свой вопрос. После небольшого исследования и помощи друга и босса Линуса я обнаружил, что мне нужно заставить терминал перейти в графический режим, а затем распечатать специальные символы, а затем вернуться в текстовый режим. код ascii для переключения в графический режим - 14 и 15 вернется в текстовый режим. так вот код в рубине:

printf("%c\n", 14)
printf("%c ", 0x6A) # ┘
printf("%c ", 0x6B) # ┐
printf("%c ", 0x6C) # ┌
printf("%c ", 0x6D) # └
printf("%c ", 0x6E) # ┼ 
printf("%c ", 0x71) # ─
printf("%c ", 0x74) # ├
printf("%c ", 0x75) # ┤
printf("%c ", 0x76) # ┴
printf("%c ", 0x77) # ┬
printf("%c\n", 0x78) # │


a = sprintf("%c", 0x6C) + # ┌
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c\n", 0x6B) +  # ┐
sprintf("%c", 0x78) + # │
#print("      ")
"      " + 
sprintf("%c\n", 0x78) + # │
sprintf("%c", 0x6D) + # └
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x6A)  # ┘

puts a

printf("%c\n", 15)

Ответ 2

Вам действительно нужно исследовать ncurses и его варианты. Существует множество различных языковых привязок, хотя он был первоначально написан для C. Он предоставляет довольно значительный набор библиотек для создания TUI (текстовых интерфейсов) с окнами, меню, рамками в коробке и т.д. Попадите в wikipedia, чтобы начать с поиска других ссылок.