2

来自http://blocktronics.org/的ANSI 文件似乎使用了另一种 ANSI 编码,而不是我的 VT100 终端仿真器支持的编码。

如果我用 来查看这些文件tetraview,它们看起来不错。但是,如果我使用less -r块字符查看它们不起作用。如果我使用iconv -f 437 -t utf-8 | less -r,块字符可以工作,但字符的对齐仍然混乱。它适用于tetraview,因此必须进行某种转换。

tetraview我写了一个脚本来抓取运行中的屏幕内容tmux,但这是一个 hack,我想做自己的转换tetraview

4

4 回答 4

3

涉及两个问题

  • 编码需要从CP 437转换为您的终端编码。这是使用iconv -f 437 input_file.ANS您已经发现的方法完成的。
  • ANSI 转义序列需要修复。

其中dman-warrior.ANS使用了两种类型的转义序列。第一个只使用一次,是文件中的第一件事。它是ESC[0m并且它会重置所有图形模式属性。第二种类型是ESC[<value>C(例如ESC[24C),它将光标<value>字符向前(向右)移动。如果光标不能继续前进,它就会停止。您可以使用以下 shell 命令在终端中对其进行测试:

printf '\x1b[10000CXYZ\n'

它应该如下所示:

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

图像文件只有几行(由 CRLF 分隔)。每个都包裹到终端宽度(80 列),从而产生几条屏幕线。

ESC[<value>C图像可以到从文件行中间的转义序列开始的第一个屏幕行。

  • 终端写入上一个屏幕行,在最后一列结束。
  • ESC[<value>C符合转义序列。在最后一列,光标不能再向右移动,因此忽略该序列。
  • 接下来是一个字符,它强制换行并打印在下一个屏幕行上。

新的屏幕行缺少应该被转义序列跳过的空白空间。

可能的解决方案

  • 以某种方式改变终端仿真器的行为。(我不知道怎么做,除了编译一个经过调整的自定义版本。)
  • 明确断线。如果这ESC[<value>C是唯一使用的转义序列,那么编写一个修复图像的程序应该很容易。
于 2013-12-11T10:18:36.990 回答
2

这些文件都是“动画”类型,它依赖于特定的屏幕宽度和高度来显示它。您的终端可能没有正确的宽度。

于 2013-12-10T17:32:33.673 回答
2

Littleimp 的回答有些正确。

许多 ANSI 艺术品设计用于比标准 80 列更宽的终端尺寸。Janus 认为这种艺术仅适用于 80 列是不正确的。仔细的目视检查会发现有些使用每行使用更多的字符。

与大多数标准文本文件不同,许多 ANSI 艺术文件 /not/ 包含 CR 或 CR/LF 来终止每一行的结尾,而是允许终端为它们换行到下一行。这使他们可以使用终端的完整列,例如 80 或 132,而不必在行尾之前进行 CRLF,从而使最大宽度为 79 或 131。

因此,例如 blocktronicks goo-b7.ans 将无法在任何终端中正确显示,除了 160 个字符宽。

我在这里的示例 ANSI 图片上说明了这一点: https ://i.imgur.com/WBJ8xfs.png

用于在每个 X 字符后插入回车的标准 sed/awk 技巧将不起作用,因为不会跳过以 CR/LF 结尾的短行,而是在以不适当的位置插入 CR 之前从下一行的长度中减去地方。

要将这些文件转换为更健全的文件,需要一个程序/脚本来逐步遍历每一行,仅在找到具有最大行长的行时才插入 CR。

于 2018-12-31T06:33:53.117 回答
0

我在网上找了一个自动转换器,你不必安装。 http://www.gofunnow.com/convertutf8/convertutf8.php?destencoding=-2#.UqdmkifMrAk

于 2013-12-10T19:08:59.023 回答