我正在用 C# 构建一个 telnet 应用程序(用于在老式 BBS 系统上编写门游戏脚本,例如 Wildcat),但似乎无法为 ANSI 转义码(例如光标移动、着色等)构建一个可用的解析器 - 几乎所有系统我'已经测试过发送不符合任何“标准”的未定义序列。关于这个问题的资源似乎也很少,维基百科有我迄今为止找到的最深入的列表 http://en.wikipedia.org/wiki/ANSI_escape_code但即使他们说它不完整 - 而且我遇到的大多数其他网站只是复制/粘贴维基百科的文章。
我的问题:那里有图书馆吗?如果没有,一些解析代码/正则表达式怎么样?至少有一些适当的文档,例如ESC[!_
将会非常有帮助。
我真的觉得我正在重新发明轮子,特别是看到 Telnet 或多或少相当于互联网的轮子(至少在年龄方面是这样;)
EDIT:添加了一个奇怪的例子:
00000075h: 1B 5B 73 1B 5B 32 35 35 42 1B 5B 32 35 35 43 08 ; .[s.[255B.[255C.
00000085h: 5F 1B 5B 36 6E 1B 5B 75 1B 5B 21 5F 02 02 3F 48 ; _.[6n.[u.[!_..?H
00000095h: 54 4D 4C 3F 1B 5B 30 6D 5F 1B 5B 32 4A 1B 5B 48 ; TML?.[0m_.[2J.[H
000000a5h: 0C 0D 0A ; ...
The mysterious part is '21' in line 2 ---^^
正确的答案取决于人们打算如何使用该库。任何终端模拟器都会read那些序列和perform基于它们的行动。但即使是一个简单的终端模拟器也能理解大约一百个序列。
您的示例以可能更具可读性的形式如下所示:
\E[s
\E[255B
\E[255C\t_
\E[6n
\E[u
\E[!_^B^B?HTML?
\E[0m_
\E[2J
\E[H\f\r
\n
using unmap http://invisible-island.net/misc_tools/index.html#item:unmap(制作转义字符\E
并展示all可打印的字符 - 并为转义字符开始一个新行)。
ECMA-48 描述了以下格式
- 单字节控制字符,以及
- 多字节控制序列(以转义字符开头)。
控制序列的内容(参数)仅限于某些字符,例如数字和分隔符,例如,';'
。控制序列也有一个明确的结局,称为final特点。序列\E[!_^B^B?
不遵守这些规则。正如评论中所建议的,也许您的录音因终端对光标位置请求的响应而混淆\E[6n
.
有了这么多背景:
- 终端仿真器执行的一些操作会修改显示(
\E[2J
清除显示)
- 终端仿真器执行的一些操作告诉主机about显示器 (
\E[6n
询问终端光标在哪里is)
- 终端仿真器执行的一些操作会修改终端的行为(
\E[s
and \E[u
保存光标位置并稍后恢复)
简而言之,您可能会发现,要处理终端接收到的控制序列,您确实需要一个终端程序来完成所有这些工作。然而,并非所有终端仿真器都是相同的。有些使用一系列的 case 语句来处理转义、括号、数字等的连续阶段。但是您的程序应该记住,单字节控件可以出现在多字节控制序列的中间。由于它们的编码不同,因此不存在冲突。但这使程序比您想象的一次仅读取一个序列的程序更加复杂。
xterm 使用一些 case 语句(对于final字符,基本上),但解码控制序列时的大多数状态转换都是使用一组表完成的。它们非常重复,但构造起来并不明显:Paul Williams 指出,对于 VT100,这些应该是对称的(本质上将输入视为 7 位 ASCII)。有些状态被视为错误,并且ignored;无论如何,格式良好的序列才是最重要的。理论上,您可以重用状态表并添加“一点”解析。这些表有 8500 行(每行一个状态)。
除了(a)读取现有的终端模拟器并在较小范围内模仿它们,或(b)修改终端模拟器......您可以调查libvterm http://www.leonerd.org.uk/code/libvterm/:
一个抽象的 C99 库,它实现了 VT220 或类似 xterm 的终端仿真器。它不使用任何特定的图形工具包或输出系统,而是调用其嵌入程序应提供的回调函数指针以代表其进行绘制。它避免在正常运行状态下调用 malloc(),从而允许在嵌入式内核情况下使用它。
然而,这并不在C#
(以及来源is文档)。尽管如此,它也只有 5500 行代码。
进一步阅读:
- 通过计数控件来比较版本 http://invisible-island.net/xterm/xterm.faq.html#compare_versions
- XTerm 控制序列 http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
- DEC ANSI 兼容视频终端的解析器 http://vt100.net/emu/dec_ansi_parser
- ECMA-48:编码字符集的控制函数 http://www.ecma-international.org/publications/standards/Ecma-048.htm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)