ESC [(0x1b / 0x5b)序列中的空格字符使序列无效?

时间:2018-04-09 08:05:30

标签: terminal escaping vt100

我找不到有关ESC序列中应该对空格做什么的信息。示例:位置光标

ESC[10;20H

是一个有效的ESC序列,但是包含

之类的空格

ESC[ 10; 20H

也有效吗?关键是当ESC字符是一个代码为0x1b的控制字符时,其后面的文本是人和机器可读的文本,一般来说空格不应该损害ESC序列的含义,因此我只删除ESC序列中找到的所有空格

互联网上有很多关于ESC序列是什么以及它们可能包含什么的文章(但是只有少数好的和真正信息丰富的),但 none 澄清了这个问题。

我找到this one,并说

  

由于ASCII控制函数不遵循结构化语法,因此用于描述函数序列和参数的符号对于避免混淆非常重要。 转义序列显示每个字符之间有一个空格,以便于阅读。这些空格不是Escape序列的一部分。

虽然它说空格字符分隔字符是为了便于阅读,但是它们没有说保留空格是否使ESC序列无效。

是否有相关的RFC?我希望它能毫不含糊地定义这个案例。

更新:感谢Thomas指出space char是其中一个ESC序列运算符。所以现在很明显[应该遵循ESC字符,并且它们之间不允许有空格。

但是关于以下论点是什么?如上例所示,行和列坐标ESC [SP 10; SP 20H中的空格使序列无效,我必须停止处理它而不是开始显示空格字符?

Update1:​​我使用Windows telnet应用程序进行了小测试。登录到远程服务器,该服务器以ESC顺序响应。结果是:

ESC[2;5H正确排第2列第5列

ESC[ 2; 5H在当前光标位置显示“2; 5H”

ESC[2 ; 5H在当前光标位置显示“; 5H”

因此,基于实证结果,我怀疑不允许使用空格,而空格char会使序列无效/取消。

1 个答案:

答案 0 :(得分:0)

ECMA-48是值得关注的地方(如果你想要一个RFC)。请注意提及 02/00 (它表示空间的十六进制0x20的方式)。

对于它的价值,有DEC控制序列(VT220及以上)带有嵌入空间,例如marked with 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))通过名称显示,例如 {{1 }}