gle*_*roo 5 c# parsing telnet ansi-escape
我正在用 C# 构建一个 telnet 应用程序(用于在老式 BBS 系统上编写门游戏脚本,例如 Wildcat)并且似乎无法为 ANSI 转义码(例如光标移动、着色等)构建一个工作解析器 - 几乎所有系统我' ve 测试发送无视任何“标准”的未定义序列。关于这个问题的资源似乎也很少,维基百科有我迄今为止找到的最深入的列表,但即使他们说它不完整 - 而我遇到的大多数其他网站只是复制/粘贴维基百科的文章。
我的问题:那里有图书馆吗?如果没有,一些解析代码/正则表达式怎么样?至少,一些适当的文档对于诸如此类的事情ESC[!_会非常有帮助。
我真的觉得我正在重新发明轮子,尤其是看到 Telnet 或多或少相当于互联网的轮子(至少在年龄方面;)
编辑:添加了一个奇怪的例子:
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 ---^^
Run Code Online (Sandbox Code Playgroud)
正确的答案取决于人们打算如何使用该库。任何终端模拟器都会读取这些序列并根据它们执行操作。但即使是一个简单的终端模拟器也能理解大约一百个序列。
\n\n您的示例以可能更具可读性的形式如下所示:
\n\n\n\\E[s\n\\E[255B\n\\E[255C\\t_\n\\E[6n\n\\E[u\n\\E[!_^B^B] ?HTML?\n\\E[0m_\n\\E[2J\n\\E[H\\f\\r\n\\n\n\n\n
使用unmap(使转义字符\\E并显示所有可打印的字符 - 并为转义字符开始一个新行)。
ECMA-48 描述了以下格式
\n\n控制序列的内容(参数)仅限于某些字符,例如数字和分隔符,例如\';\'。控制序列也有一个明确的结局,称为最终字符。该顺序\\E[!_^B^B?不遵循这些规则。正如评论中所建议的,也许您的录音因终端对光标位置请求的响应而混淆\\E[6n。
有了这么多背景:
\n\n\\E[2J清除显示)\\E[6n询问终端光标在哪里)\\E[s并\\E[u保存光标位置并稍后恢复)简而言之,您可能会发现,要处理终端接收到的控制序列,您确实需要一个终端程序来完成所有这些工作。然而,并非所有终端仿真器都是相同的。有些使用一系列 case 语句来处理转义、括号、数字等的连续阶段。但是您的程序应该记住,单字节控件可以出现在多字节控制序列的中间。由于它们的编码不同,因此不存在冲突。但这使程序比您想象的一次仅读取一个序列的程序更加复杂。
\n\nxterm 使用一些 case 语句(基本上用于最终字符),但解码控制序列时的大多数状态转换都是使用一组表完成的。它们非常重复,但构造起来并不明显:Paul Williams 指出,对于 VT100,这些应该是对称的(本质上将输入视为 7 位 ASCII)。有些状态被视为错误并被忽略;无论如何,格式良好的序列才是最重要的。理论上,您可以重用状态表并添加“一点”解析。这些表有 8500 行(每行一个状态)。
\n\n除了(a)读取现有的终端模拟器并在较小范围内模仿它们,或(b)修改终端模拟器......您可以调查libvterm:
\n\n\n一个抽象的 C99 库,它实现了 VT220 或类似 xterm 的终端仿真器。它不使用任何特定的图形工具包或输出系统,而是调用其嵌入程序应提供的回调函数指针以代表其进行绘制。它避免在正常运行状态下调用 malloc(),从而允许在嵌入式内核情况下使用它。
\n
然而,这并不在C#(来源是文档)。不过,它只有 5500 行代码。
进一步阅读:
\n\n\n