2010-12-20 46 views
13

我正在試圖打印一張比它的純文本表示更令人愉快的表格。基本上我想要的東西轉換這樣的:在使用ANSI盒子字符的終端中繪製表格

+-----+--------+ 
| 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字符和couldn」通過Google搜索找到任何關於它的信息。任何人都可以在這個話題上談一談?

回答

18

我想我應該回答我自己的問題。經過一些研究和朋友和老闆Linus的幫助,我發現我需要強制終端先進入圖形模式,然後打印特殊字符,然後返回到文本模式。切換到圖形模式的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) 
3

你真的應該調查ncurses及其變體。雖然它最初是爲C語言編寫的,但它提供了一系列不同的語言綁定。它提供了一套相當大的庫,用於生成帶有窗口,菜單,盒裝邊框等的TUI(文本UI)。 打開wikipedia以開始查找一些其他參考。