我找不到有关应该对ESC序列中的空格执行哪些操作的信息。示例:位置光标
ESC[10;20H
是一个有效的 ESC 序列,但它是包含空格的序列,例如
ESC[ 10; 20H
也有效?关键是,虽然 ESC 字符是带有代码0x1b的控制字符,但它后面的文本是人类和机器可读的文本,并且在一般空间中不应损害 ESC 序列的含义,因此我只会删除在 ESC 序列中找到的所有空格。
互联网上有很多文章谈论ESC序列是什么以及它们可能由什么组成(但是只有少数好的和真正有用的),但没有一篇澄清这个问题。
我找到了这个,它说
由于 ASCII 控制函数不遵循结构化语法,因此用于描述函数序列和参数的表示法对于避免混淆非常重要。转义序列在每个字符之间显示一个空格,以使其更易于阅读。这些空格不是转义序列的一部分。
虽然它说空格字符分隔字符以提高可读性,但他们没有说保持空格是否会使 ESC 序列无效。
是否有任何相关的 RFC?我希望它能明确地定义这种情况。
更新:感谢托马斯指出空格字符是 ESC 序列运算符之一。所以现在很明显 [ 应该遵循 ESC 字符,并且它们之间不允许有空格。
但是,以下论点是什么?如上例所示,行和列中的空格坐标为 ESC[SP
10;SP
20H 使序列无效,我必须停止处理它开始显示空格字符?
更新1:我使用Windows远程登录应用程序进行了小测试。登录到远程服务器,该服务器以 ESC 序列进行响应。结果是:
正确ESC[2;5H
位置 第 2 行第 5 列
ESC[ 2; 5H
显示"2;当前光标位置为 5H">
ESC[2 ; 5H
显示";当前光标位置为 5H">
因此,根据经验发现,我怀疑不允许使用空格,并且空格字符会使序列无效/取消。
ECMA-48是查找的地方(如果你想要一个RFC)。 查找提及02/00
(它表示十六进制0x20空格的方式)。
值得一提的是,有带有嵌入式空间的 DEC 控制序列(VT220 及以上),例如,标有SP
的那些:
Controls beginning with ESC
This excludes controls where ESC is part of a 7-bit equivalent to 8-bit
C1 controls, ordered by the final character(s).
ESC SP F 7-bit controls (S7C1T), VT220.
ESC SP G 8-bit controls (S8C1T), VT220.
ESC SP L Set ANSI conformance level 1 (dpANS X3.134.1).
ESC SP M Set ANSI conformance level 2 (dpANS X3.134.1).
ESC SP N Set ANSI conformance level 3 (dpANS X3.134.1).
在您的示例中,空格只是为了提高可读性,非打印字符(如 ASCII转义(十进制 27,十六进制 01xb)由ESC
等名称显示。