15

我正在尝试打印一个比纯文本表示更令人赏心悦目的表格。基本上我想转换这样的东西:

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

像这样:

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

这是我在终端中看到的屏幕截图:

在终端看起来像这样

注意行之间的间隙。我的问题是它们没有正确连接,而其他使用 ANSI 打印的 Unix 工具在终端中看起来很好。例如,树,如果我tree -A在终端中运行`我得到这个:

终端树

注意垂直线是如何连接在一起的。这很有趣,因为当我将 tree 的输出复制并粘贴到我的文本编辑器中并运行我的脚本时,我会得到这样的结果:

我的代码中的树

显然,我遗漏了一些关于在终端中打印 ANSI 字符的信息,并且通过谷歌搜索找不到任何关于它的信息。任何人都可以对这个话题有所了解吗?

4

2 回答 2

24

我想我应该回答我自己的问题。经过一番研究和朋友和老板Linus的帮助,我发现我需要先强制终端进入图形模式,然后打印特殊字符,然后再返回文本模式。切换到图形模式的 ascii 代码是 14,而 15 将返回到文本模式。所以这是ruby中的代码:

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)
于 2010-12-21T13:16:54.723 回答
3

您确实应该研究 ncurses 及其变体。有一系列不同的语言绑定,尽管它最初是为 C 编写的。它提供了一套相当丰富的库,用于生成带有窗口、菜单、框边框等的 TUI(文本 UI)。点击维基百科开始查找一些其他参考。

于 2010-12-20T23:01:42.290 回答