ANSI转义序列

title: 历史.
content: 最初,几乎每个视频终端制造商都各自添加了特定的转义序列用于执行一些特殊操作,比如把光标置于屏幕上的某个位置。举例来说,终端允许通过发送codice_1字符、codice_3字符,后面跟上两个等于x,y位置的数值加上32的字符(这是为了从ASCII空格字符开始,并避开控制字符),将光标置于屏幕上的x,y位置。  由于这些序列对于不同的终端并不一样,因此人们不得不开发了一些复杂的库(比如)和实用程序(比如),以便程序可以使用同一套API应对各种终端。另外,在很多终端中需要借助字符的二进制值发送数字(如行和列)。对于某些编程语言,以及内部不使用ASCII的系统来说,把数字转换为正确的字符常常是有困难的,甚至完全做不到。  ANSI标准试图解决这些问题。标准制订了一种所有终端共享的指令集,并要求用ASCII的数字字符传递所有数值信息。该系列的第一个标准是1976年通过的ECMA-48。它是一系列字符编码标准的延续,其中第一个是从1965年的,一个7位标准,ISO 646就源自此标准。“ANSI转义序列”的名称可以追溯到1979年ANSI采用ANSI X3.64。此外,ANSI X3L2委员会与ECMA委员会TC 1合作制订了一个几乎一模一样的标准。以上两个标准合并为ISO 6429的国际标准。1994年,ANSI取消了其标准,以支持国际标准。  第一个支持这个标准的流行视频终端是1978年推出的Digital 。这个终端在市场上非常成功,引发了各种各样的仿制品,其中最早和最流行的是1979年的Zenith Z-19。其他品牌还有 QVT-108, TVI-970, WY-99GT。另外,许多其他品牌的终端也不同程度地兼容可选的“VT100”、“VT103”或“ANSI”模式。 随着越来越多的软件(尤其是BBS系统)普及,越来越多的软件依赖转义序列起作用,导致几乎所有新的终端和终端模拟器都支持了此标准。  1981年,ANSI X3.64被美国政府采用(FIPS 86)。后来,美国政府停止复制行业标准,所以FIPS 86又被撤回了。  ECMA-48已经经历了多次更新换代,目前是从1991年开始的第5版。它也被ISO和IEC用作标准ISO/IEC 6429。
title: 平台支持.
content: 随着诸多BBS和线上服务广泛使用ANSI,到20世纪80年代中期,ANSI几乎得到了全平台支持。尽管许多操作系统在标准文本输出中越来越多地支持ANSI,但大多数情况下是以终端模拟器的形式(例如Unix上的xterm,或MacOS上的OS X Terminal或,以及IBM PC上的许多通信程序)。  Unix和AmigaOS都在操作系统中包含了对ANSI的一些支持,导致在这些平台上运行的程序广泛使用ANSI。 类Unix操作系统可以通过像和之类的库来生成ANSI代码,许多软件使用这些库升级显示方式。这些库也应该支持非ANSI终端,但是现在很少有人测试,所以很可能已经不起作用了。许多游戏和shell脚本直接输出ANSI序列(如彩色的提示信息),因此无法在不支持ANSI的终端上运行。  AmigaOS不仅支持输出到屏幕上的文本使用ANSI序列,打印机驱动程序也支持(用AmigaOS的专有扩展),并将它们转换为与特定打印机实际通信所需的代码。  尽管ANSI很普及,却并没有得到全平台支持。比如原始的“经典”Mac OS就没有内置对ANSI的支持,再比如Atari ST使用的是VT52改编的命令系统,用一些扩展程序支持颜色显示。
title: Windows和DOS.
content: MS-DOS 1.x不支持ANSI或任何其他转义序列,只有少数控制字符(BEL、CR、LF、BS)可以由底层BIOS解释,所以几乎不可能做出任何全屏应用程序。所有显示效果都必须通过BIOS调用,或者直接控制IBM PC硬件来完成,调用速度非常慢。  DOS 2.0引入了添加设备驱动程序来支持ANSI转义序列的功能(事实上的标准是ANSI.SYS,但也使用了ANSI.COM、NANSI.SYS和ANSIPLUS.EXE等其他程序。因为绕过了BIOS,所以这些程序的速度比以前快了不少)。但由于实际运行速度仍然比较慢,以及默认并没有安装,所以还是很少得到利用。应用程序往往还是继续用直接控制硬件的方式来显示所需的文本。ANSI.SYS和类似的驱动程序继续在Windows 9x上工作,直到Windows Me,在NT衍生系统中用于在下执行的16位传统程序。  Win32控制台完全不支持ANSI转义序列。不过有一些控制台的替代品或者附加软件具有解释程序输出的ANSI转义序列的功能,例如JP Software的TCC(以前的4NT)、Michael J. Mefford的ANSI.COM、Jason Hood的ANSICON和Maximus5的ConEmu。有一个Python软件包在内部解释了打印文本中的ANSI转义序列,将它们转换为系统调用来操纵颜色和光标位置,以便更容易地将使用ANSI的Python代码移植到Windows。  2016年,在Windows 10发布“Threshold 2”时,微软开始在控制台应用程序中支持ANSI转义序列,使得从Unix移植软件或者远程访问Unix变得更容易。
title: 转义序列.
content: 序列具有不同的长度。所有序列都以ASCII字符codice_1(27 / 十六进制 0x1B)开头,第二个字节则是0x40–0x5F(ASCII codice_5)范围内的字符。  标准规定,在8位环境中,这两个字节的序列可以合并为0x80-0x9F范围内的单个字节(详情请参阅C1控制字符集)。但是,在现代设备上,这些代码通常用于其他目的,例如UTF-8的一部分或CP-1252字符,因此并不使用这种合并的方式。  除ESC之外的其他C0代码(通常是BEL,BS,CR,LF,FF,TAB,VT,SO和SI)在输出时也可能会产生与某些控制序列相似或相同的效果。  按下键盘上的特殊键,以及输出xterm CSI、DCS或OSC序列,常常用于产生从终端发送到计算机的CSI,DCS或OSC序列,就像用户使用键盘输入的一样。
title: CSI序列.
content: CSI序列由codice_6、若干个(包括0个)“参数字节”、若干个“中间字节”,以及一个“最终字节”组成。各部分的字符范围如下:  所有常见的序列都只是把参数用作一系列分号分隔的数字,如codice_7。缺少的数字视为0(如codice_8相当于中间的数字是0,codice_9这样没有参数的情况相当于参数为0)。某些序列(如CUU)把0视为1,以使缺少参数的情况下有意义。  一部分字符定义是“私有”的,以便终端制造商可以插入他们自己的序列而不与标准相冲突。包括参数字节codice_10的使用,或者最终字节0x70–0x7F(codice_11选择RGB前景色  作为ISO / IEC国际标准8613-6采用的ITU的T.416信息技术-开放文档体系结构(ODA)和交换格式:字符内容体系结构给出了一个似乎不太受支持的替代版本: 请注意,这里使用了保留的“:”字符来分隔子选项,这可能是在实际实现中造成混淆的始作俑者。它还使用“3”作为第二个参数来指定使用青-品红-黄方案的方案,“4”用于青-品红-黄-黑的方案,后者使用上面标记为“unused”(“未使用”)的位置作为黑色组件。  还要注意,许多识别“:”作为分隔符的实现错误地忽视了色彩空间标识符参数,并因此改变了其余部分的位置。
title: 示例.
content: codice_15 — 清除屏幕、(在某些设备上)把光标置于1,1位置(左上角)。  codice_16 — 使文字呈绿色。在MS-DOS上,一般绿色是暗淡的绿色,可以用codice_17启用粗体使其变成明亮的绿色,或者将两者合并为codice_18。MS-DOS ANSI.SYS用粗体状态使字符变亮,闪烁状态(通过codice_19)使背景色变成明亮模式。MS-DOS ANSI.SYS并不直接支持SGR代码90–97和100–107。  codice_20 — 重新分配F10键的功能为发送字符串“DIR”和回车符到键盘缓存中,在DOS命令行里会显示当前目录的内容(仅MS-DOS ANSI.SYS)。这种序列有时用于“ANSI炸弹”。这是一个私用编码(如字母p所示),用非标准的扩展使其包含一个字符串参数。如果按标准,会认为字母D是序列的末尾。  codice_21 — 保存光标的位置。用序列codice_22会把光标重置回这个位置。假设当前的光标位置是7(y)、10(x)。序列codice_21会保存这两个数值。现在可以把光标移动到其他位置,比如用序列codice_24或codice_25把光标移动到20(y)、3(x)。现在如果用序列codice_22,光标会回到7(y)、10(x)。某些终端需要使用DEC序列codice_27/codice_28,这得到了更广泛的支持。
title: 使用Shell脚本的示例.
content: ANSI转移代码常常用于UNIX和类UNIX终端,以提供语法高亮功能。例如,在兼容的终端上,以下ls命令按类型对文件和目录的名称进行颜色编码。  用户可以在脚本中使用转义码,将其作为标准输出或标准错误输出的一部分。例如,下面的GNU sed命令通过反显“WARN”开头的单词的行,以及使用暗红色背景色和亮黄色前景色显示以“ERR”开头的单词(字母大小写被忽略)的行来修饰make命令的输出。突出显示了设置ANSI代码的部分。  以下Bash函数会使终端闪烁(通过交替发送反相和正常显示模式代码),直到用户按下任意键。这个函数可以用于当一个冗长的命令终止时提醒用户,用法如codice_30。  下面这个命令可以重置控制台,类似现代Linux系统的codice_31命令。然而,即使在较早的Linux系统和其他(非Linux)UNIX变体上,也应该能起作用。

Summary: ANSI转义序列(ANSI escape sequences)是一种的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以codice_1转义字符和"["字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码。

ANSI-Escapesequenz: ANSI-Escapesequenzen oder ANSI-Escapecodes sind Zeichenfolgen zur Bildschirmsteuerung (Escapesequenzen), die das ASCII-/ANSI-Zeichen 27 (1B hexadezimal), „Escape“, als einleitendes Steuerzeichen nutzten und auf dem Standard von ANSI X3.64 und ECMA-48 beruhen. Diese ANSI/ECMA-Norm definiert einen Standard zur Bildschirm- und Tastatursteuerung auf Terminals wie der DEC VT100 (1979). Außer auf Terminals selbst sind ANSI-Escapesequenzen in entsprechenden Terminalemulationen und in Kommandozeileninterpretern implementiert.