15

純粋なテキスト表現よりも見た目に心地よい表を印刷しようとしています。基本的に私はこのようなものを変換したいと思います:

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

このようなものに:

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

これが私がターミナルで見るもののスクリーンショットです:

ターミナルではこのように見えます

行間のギャップに注意してください。私の問題は、ANSI印刷を使用する他のUnixツールがターミナルで正常に表示されているのに、正しく接続されていないことです。たとえば、ツリーをtree -Aターミナルで実行すると、次のようになります。

ターミナルの木

垂直線がどのように接続されているかに注目してください。ツリーの出力をコピーしてテキストエディタに貼り付けてスクリプトを実行すると、次のようになります。

私のコードのツリー

明らかに、ターミナルで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 に答える