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

时间:2010-12-20 21:51:41

标签: unix terminal tabular

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

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

这样的事情:

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

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

in terminal looks like this

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

tree in terminal

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

tree in my code

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

2 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:3)

你真的应该调查ncurses及其变种。有一系列不同的语言绑定,虽然它最初是为C语言编写的。它提供了一个相当大的库套件,用于生成带有窗口,菜单,盒装边框等的TUI(文本UI)。 点击维基百科,开始寻找其他参考资料。