在终端中使用ANSI盒字符绘制表格

17
我想打印一个表格,使其比纯文本表示更加美观。基本上我想将这样的内容转换为:
+-----+--------+
| age | weight |
+-----+--------+
| 10  | 100    |
| 80  | 500    |
+-----+--------+

变成像这样:

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

以下是终端上显示的屏幕截图:

在终端中显示的样子

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

在终端中以树形结构显示的目录

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

在我的代码中以树形结构显示的目录

显然,我在终端中打印 ANSI 字符方面缺少了一些东西,而在谷歌搜索中找不到任何相关信息。有人能否在这个话题上提供一些帮助?

2个回答

27

我想我应该回答自己的问题。经过一些研究和朋友以及老板 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)

嗨,我知道这很老了,但我在Mac终端上遇到了同样的问题。我尝试了14/15个解决方案,但对我来说都不起作用。你有什么想法为什么吗? - Fis

3

我建议你研究一下ncurses及其变体。虽然它最初是为C语言编写的,但提供了一套相当丰富的库,可用于生成具有窗口、菜单、框边等TUI(文本用户界面)。

可以先查看维基百科获取更多参考资料。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接