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

All*_*rgi 15 unix terminal tabular

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

+-----+--------+
| age | weight |
+-----+--------+
| 10  | 100    |
| 80  | 500    |
+-----+--------+
Run Code Online (Sandbox Code Playgroud)

这样的事情:

????????????????
| age | weight |
????????????????
? 10  ?   100  ?
? 80  ?  500   ?
????????????????
Run Code Online (Sandbox Code Playgroud)

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

在终端看起来像这样

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

终端的树

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

我的代码中的树

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

All*_*rgi 23

我想我应该回答我自己的问题.经过一番研究和朋友老板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)
Run Code Online (Sandbox Code Playgroud)