转义字符

来自GSXAB的知识库
转义字符
术语名称 转义字符
英语名称 escape character
转义序列
术语名称 转义序列
英语名称 escape sequence

转义字符(escape character)是字符中根据作用划分的一个类别。转义字符通常出现在文本环境中,改变其后有限的数个字符的解释方式,这些后续字符将失去原义,并按特殊规则解释。由转义字符开始,包含这些被改变解释方式的字符,所构成的字符串可以看作一个产生新解释的整体,称为转义序列(escape sequence)。

转义字符
术语名称 转义字符
英语名称 escape character
别名 ESC

转义字符(escape character)也是一个控制字符的名称,该字符也有上述作用,因此使用了同一词语。出现在很多字符集中。在 ASCII 中为 0x1B ,或更好记的 0o33 ,在 EBCDIC 中为 0x27 ,在 Unicode 中为 U+001B <control-001B>, ESCAPE 。需要指代这一字符时,经常缩写为 ESC ,也被展示为 ␛ (U+241B Symbol for Escape)。在 ^ 表示法中表示为 ^[ 。 C 语言及相关语言将这个字符记为 \033 ,有的扩展中可以使用 \e

历史

在远程通讯中,用于标记接下来几个字符不使用字符本义的特殊控制字符,被称为 escape 字符,可能取的是“逃脱(escape)被字面解释”的含义。中文译为“转义”。目前在终端中仍然使用。

输入这一字符时,曾经在键盘上使用专属的同名按键输入,这一按键发展为现在的 Escape ⎋ 键(跳出键),或称为 Esc 键。由于该按键在常见的键盘上过于偏僻,这一字符输入时可以使用 Ctrl+[ 代替, Esc 键的这一用法逐渐消失。后来在窗口系统中, Esc 按键曾被借用于触发从窗口等的退出、取消、中止动作,因此中文名称被译为“跳出”。但 Esc 键不是操作系统管理而是应用程序自行处理,这一习惯只是约定俗成,而且也在逐渐失去统一性。

现代使用

控制字符在进行文本解析时仍然有不同的功能,比如 C1 控制字符(0x80-9F)可以通过对应的转义序列 0x1B.40-5F 表达。

常见序列可参考: https://en.wikipedia.org/wiki/ANSI_escape_code

终端中仍然通过 0x9B CSI (Control Sequence Introducer),也就是 0x1B.5B ESC [ 开始的序列触发改变颜色、光标位置、格式等非文本的指令,在终端中使用 ^ 表示法时会展示为 ^[[ 。常见的有尾随数字之后一个 m 的 ^[[3;31;42m (设置斜体红底绿字)的 SGR (Select Graphic Rendition) 类和接可选数字然后是一个特定字母的,比如 ^[[5A 会使得光标向上移动 5 行。但是这样的序列在输出到终端时就会按整个转义序列生效,几乎不会出现在文本文件中。

ISO 2022 规则下 0x8E SS20x8F SS3 也可以通过 ESC 字符表达为 0x1B.4E ESC N0x1B.4F ESC O

一般通过 EscCtrl+[ 在终端输入这一字符,并触发对应的转义序列。也可以使用 echo 将通过 Ctrl+V EscCtrl+V Ctrl+[ 打出的转义序列输出到终端。程序直接向终端输入的 ESC 序列也有效。

常见起转义作用的字符

ESC 字符是终端中的转义字符,但是在不同上下文中,转义这一功能也可能由其他字符担任。一般来说,转义字符只会出现在部分字符需要不止一种解释方式的上下文中,这是因为解释方式不止一种才需要转义。文本文件中每个字符可能代替它自身,又需要通过这些字符进行控制,也就是需要第二种含义,因此才存在转义字符使得部分普通字符可以被解释为控制含义。

  • 编程语言
    • C 语言系及其他有参考的语言中,在字符和字符串的表示中会通过 \ 开始的序列进行转义,不使用时表示字符字面本身,使用时表示特殊含义。 C 语言的转义字符列表见 https://en.cppreference.com/w/cpp/language/escape.html
    • shell 中 \ 是防止下个字符被理解为元字符, ' ' 防止括起的任何字符被理解为元字符。特殊的字符直接使用会被默认作为元字符处理,加上转义后才表示字符本身。
    • 正则表达式 中根据不同的版本有差异,通常 \ 会防止下个字符被理解为元字符。特殊的字符直接使用会被默认作为元字符处理,加上转义后才表示字符本身。但是在部分场景下可能有部分字符转义前后的解释方式是反过来的。
  • 标记语言
    • SGML 系,即 XMLHTML 等中,使用 & 开头 ; 的字符实体,可以广义上看作转义字符。
    • JSON 中使用类似 C 语言风格的转义字符标记字符串中的特殊字符。
  • 其他:
    • URIURL 中使用 % 开头的转义序列编码特殊字符。

实际上自然语言中引号在起“特定称谓”和“特殊含义”作用时,也是提醒读者这一词汇并不能按照字面含义理解,和转义字符有一定类似之处。只是这一转义更多在于逻辑上的比喻或象征,而不是显示方面。比如“一群大雁往南飞,一会儿排成个‘人’字,一会儿排成个‘一’字”一句中,“人”和“一”的引号表示它们在这里是特殊含义,不表示人这个物种的个体、不表示数字一,而只表示这两个字的形状。

参考资料