2

http://blocktronics.org/のANSI ファイルは、VT100 ターミナル エミュレータでサポートされているものとは別の ANSI エンコーディングを使用しているようです。

それらのファイルをtetraviewで表示すると、まともに見えます。しかしless -r、ブロック文字で表示すると機能しません。を使用するiconv -f 437 -t utf-8 | less -rと、ブロック文字は機能しますが、文字の配置はまだめちゃくちゃです。で動作するtetraviewため、何らかの変換が行われている必要があります。

tetraviewで実行中の画面内容をスクレイピングするスクリプトを書いたのですtmuxが、それはハックで、自分で行う変換を行いたいと考えてtetraviewいます。

4

4 に答える 4

3

関連する2 つの問題があります。

  • エンコーディングは、 CP 437から端末のエンコーディングに変換する必要があります。これはiconv -f 437 input_file.ANS、すでに発見したものを使用して行われます。
  • ANSI エスケープ シーケンスを修正する必要があります。

ではdman-warrior.ANS、2種類のエスケープ シーケンスが使用されます。最初のものは一度だけ使用され、ファイルの最初のものです。これはESC[0m、すべてのグラフィック モード属性をリセットします。2 番目のタイプはESC[<value>C(eg ESC[24C) で、カーソル<value>文字を前方 (右) に移動します。カーソルがそれ以上移動できない場合は停止します。次のシェル コマンドを使用して、ターミナルでテストできます。

printf '\x1b[10000CXYZ\n'

次のようになります。

|$ printf '\x1b[10000CXYZ\n'              |
|                                        X|
|YZ                                       |
|$                                        |

画像ファイルには数行しかありません (CRLF で区切られています)。それぞれが端末の幅 (80 列) に折り返されるため、複数のスクリーン行が生成されます。

ESC[<value>C画像は、ファイル行の途中にあるエスケープ シーケンスで始まる最初の画面行までは OK です。

  • ターミナルは前の画面行を書き込み、最後の列で終了します。
  • ESC[<value>Cエスケープ シーケンスが満たされています。最後の列にあるため、カーソルはそれ以上右に移動できないため、シーケンスは無視されます。
  • 次に、行を強制的に折り返す文字が続き、次のスクリーン行に出力されます。

新しい画面行には、エスケープ シーケンスによってスキップされるべき空白がありません。

可能な解決策

  • 端末エミュレータの動作を何らかの方法で変更します。(微調整したカスタムバージョンをコンパイルする以外は、方法がわかりません。)
  • 明示的に改行します。ESC[<value>Cエスケープ シーケンスが 1 つしか使用されていない場合は、イメージを修正するプログラムを簡単に作成できます。
于 2013-12-11T10:18:36.990 に答える
2

これらのファイルはすべて、特定の画面幅と高さに依存して表示する「Ansimation」タイプです。端末の幅が正しくない可能性があります。

于 2013-12-10T17:32:33.673 に答える
2

Littleimp's answer was somewhat correct.

Many ANSI art pieces are designed for terminal sizes wider than the standard 80-column of the day. Janus is incorrect that this art is only made for 80-columns. A careful visual inspection would have revealed that some use use far more characters per line.

Unlike most standard text files, many ANSI artfiles do /not/ contain CR or CR/LF to terminate the end of every line, but rather allow the terminal to wrap to the next line for them. This gives them use of the full columns of the terminal, e.g. 80 or 132, without having to CRLF before end of line, making the maximum width 79 or 131.

So for e.g. blocktronicks goo-b7.ans will not display correctly in any terminal besides 160 characters wide.

I have illustrated this on a sample ANSI picture here: https://i.imgur.com/WBJ8xfs.png

The standard sed/awk tricks for inserting a Carriage-Return after every X characters won't work, since short lines terminated with CR/LF will not be skipped, but rather subtracted from the next line's length before a CR is inserted at an inappropriate place.

To convert these files to something saner, one would need a program/script that steps through each line, only inserting a CR when a line is found with maximum line length.

于 2018-12-31T06:33:53.117 に答える
0

オンラインで探していたところ、インストールする必要のない自動コンバーターが見つかりました。 http://www.gofunnow.com/convertutf8/convertutf8.php?destencoding=-2#.UqdmkifMrAk

于 2013-12-10T19:08:59.023 に答える