escape sequence
在计算机科学中,转义序列是具有不同于其中包含的文字字符的含义的字符的组合;[1]它由一个或多个前面的(并且可能是终止的)字符来标记。

例子

  • 在C语言和许多派生编程语言中,字符串转义序列是一系列两个或多个字符,以反斜杠\开始。
    • 请注意,在C中,紧跟换行符的反斜杠不构成转义序列,而是在第二个转换阶段将物理源行拼接成逻辑行,而字符串转义序列在第五个转换阶段转换。
    • 要表示反斜杠字符本身,可以使用\,其中第一个反斜杠表示转义,第二个反斜杠指定转义反斜杠。
    • 字符可以用多种不同的方式转义。假设ASCII编码,转义序列\x5c、\、\134和\x5c都编码相同的字符:反斜杠\。
  • 对于响应ANSI转义序列的设备,以ASCII“转义”字符(十进制字符代码27)开头,后跟左方括号字符[(十进制字符代码91)的三个或更多字符的组合定义转义序列。

    控制序列

    当指示时,这一系列字符用于改变计算机及其连接的外围设备的状态,而不是像常规数据字节那样显示或打印,这些字符也被称为控制序列,反映它们在设备控制中的使用,从控制序列启动器开始-最初是“转义字符”ASCII码-字符27(十进制)-通常写在键帽上的“Esc”。
    随着ANSI终端的引入,大多数转义序列都以两个字符“Esc”开始,然后以“[”开头,或者以代码155(十进制)的特殊分配的CSI字符开头。
    并非所有控制序列都使用转义字符;例如:

  • AT/Hayes兼容调制解调器使用的调制解调器控制序列

  • Data General终端控制序列,但它们仍然经常被称为转义序列,并且今天编程语言和命令行参数中非常常见的“转义”特殊字符的使用通常使用“反斜杠”字符来开始序列。

当计算机和外设只有一个通道来回发送信息时,通常在通信中使用转义序列(因此转义序
列是带内信令的一个例子)。[11][12]当大多数哑终端使用具有7个数据位的ASCII进行通信时,转义序列很常见,有时会被用来切换到不同的字符集,用于“外来”或图形字符,否则这些字符将受到7个数据位中可用的128个代码的限制。即使是相对“哑巴”的终端也会响应一些转义序列,包括最初的机械电传打字机(“玻璃电传打字机”或VDU所基于的)对字符27和31的响应,以便在字母和数字模式之间切换。

键盘

转义字符通常分配给计算机键盘上的Esc键,并且可以通过其他方式发送,而不是作为转义序列的一部分。例如,Esc键可以在诸如vi、[13]的编辑器中用作输入字符,或者在一些应用程序中用于备份菜单中的一级。[14]惠普HP 2640终端具有用于“显示功能”模式的键,该模式将显示包括Esc在内的所有控制字符的图形,以帮助调试应用程序。
如果发送转义序列的Esc键和其他键都被认为对应用程序有意义,则在使用字符终端时会出现歧义。当应用程序接收到ASCII转义字符时,不清楚该字符是用户按Esc键的结果,还是转义序列的初始字符(例如,由按箭头键产生)。解决歧义的传统方法是观察另一个字符是否紧跟在转义字符之后。如果不是,则假定它不是转义序列的一部分。这种启发式方法在某些情况下可能会失败,特别是在没有快速现代通信速度的情况下。
转义序列至少可以追溯到1874年的波多码。

调制解调器控制程序

例如,Hayes命令集定义了单个转义序列+++。(为了将可能是数据一部分的+++解释为转义序列,发送器在+之前和之后停止通信一秒),当调制解调器在数据流中遇到这种情况时,它从其简单地将任何字符发送到电话的正常操作模式切换到命令模式,在该命令模式中假定随后的数据是命令语言的一部分。您可以通过发送O命令切换回在线模式。
Hayes命令集是模态的,从命令模式切换到在线模式。在命令和数据将快速来回切换的情况下,这是不合适的。非模式转义序列控制语言的一个例子是VT100,它使用一系列前缀为Control Sequence Introducer的命令。

与控制字符比较

Control character
控制字符是孤立地具有某些控制功能的字符,例如回车(CR)。相比之下,转义序列由一个或多个转义字符组成,这些字符改变了后续字符的解释。

ASCII视频数据终端

VT52终端使用简单的有向图命令,如escape-A:孤立地,“A”简单地表示字母“A”,但作为转义序列“escape-A”的一部分,它有不同的含义。VT52还支持参数:它不是编码为替换的直接控制语言。
后来的VT100终端实现了更复杂的ANSI转义序列标准(现在是ECMA-48),用于控制光标移动、字符集和显示增强等功能。惠普HP2640系列的挡路和字符模式的转义序列可能是最精细的,可以对按键及其软标签、图形矢量进行编程,甚至可以将数据保存到磁带或磁盘文件中。

在DOS和Windows中使用

实用程序ANSI.SYS,可用于在DOS下(通过在提示符命令中使用$e)或在16位Windows的命令窗口中启用ANSI(ECMA-48)终端转义序列的解释。直接写入显卡的GUI应用程序的兴起极大地减少了转义序列在Microsoft平台上的使用,但它们仍可用于通过基于字符的库例程(如printf)创建基于字符的交互式屏幕界面,而无需求助于GUI程序。

在Linux和Unix显示中使用

默认文本终端和文本窗口(如使用xterm)响应ANSI转义序列。

引号转义

概述

当引号/转义字符串中需要转义字符时,在编程和脚本语言中使用两种策略:

  • 双分隔符(eg:’He didn’’t do it.’)
  • 二次转义序列

后者的一个示例是使用插入符号(^)。例如,这将在CMD中输出“You can do so via Cut&Paste”。(否则,与符号的使用受到限制)

  1. echo You can do so via Cut^&Paste

详细(Detail)

更多信息:String literal § Escape sequences
另请参阅:Escape sequences in C
转义序列的一种常见用法实际上是删除在二进制数据流中找到的控制字符,以便它们不会错误地导致它们的控制功能。在这种情况下,控制字符被定义的“转义字符”(不需要是US-ASCII转义字符)和一个或多个其他字符替换;在退出控制字符将引起动作的上下文之后,序列被识别并被移除的字符替换。为了传输“转义字符”本身,发送两次即可。
在许多编程语言和命令行界面中,转义序列用在字符文字和字符串文字中,以表示不能打印或与字符或字符串的语法冲突的字符。例如,控制字符本身可能不允许放在由编辑器程序编码的程序中,或者如果键入到命令中可能会有不希望的副作用。引号结束字符对于程序员来说也是一个问题,可以通过转义它来解决。在大多数上下文中,转义字符是反斜杠(“\”)。

例子(Samples)

例如,单引号字符可能表示为’\’’,因为写’’’是不可接受的。
许多现代编程语言将双等号字符(“)指定为字符串文字的分隔符。反斜杠转义字符通常提供在字符串文字中包括双等号的方法,例如通过修改嵌入在字符串(\”)中的双等号字符的含义,或通过修改包括双等号字符的十六进制值(\x22)的字符序列的含义。这两个序列都编码文字双等号(“)。
python2:

  1. print "Nancy said "Hello World!" to the crowd."; #这是错误的语法
  2. print "Nancy said \"Hello World!\" to the crowd."; ### example of \"
  3. print "Nancy said \x22Hello World!\x22 to the crowd."; ### example of \x22

使用“\x”表示以下两个字符是十六进制数字,“22”是十六进制双等号的ASCII值。
C、C++、Java和Ruby都允许完全相同的两种反斜杠转义样式。PostScript语言和Microsoft富文本格式也使用反斜杠转义。带引号的可打印编码使用等号作为转义字符。
URL和URI使用百分比编码来引用具有特殊含义的字符,例如非ASCII字符。
另一个类似的(且部分重叠的)语法技巧是Stroping。
一些编程语言还提供了其他方式来表示文字中的特殊字符,而不需要转义字符(参见例如分隔符冲突)。

另请参阅