ANSI转义序列

ANSI转义序列是一种带内信号的转义序列标准，用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列，大部分以ESC转义字符和"["字符开始，终端会把这些字节序列解释为相应的指令，而不是普通的字符编码。
ANSI序列是在二十世纪七十年代引入的标准，用以取代特定于终端供应商的序列，并在二十世纪八十年代早期开始在计算机设备市场上广泛使用。与早期缺少光标移动功能的系统相比，新生的电子公告板系统使用ANSI序列改进其显示。正是因为这个原因，ANSI序列变成了所有制造商共同采用的标准。
在21世纪，尽管硬件文本终端已经越来越少了，但ANSI标准依然存在，因为大多数终端模拟器会对部分ANSI转义序列进行解释。一个值得注意的例外是，在微软Windows 10更新TH2之前，Windows操作系统的Win32控制台是不支持ANSI转义序列的。

历史

最初，几乎每个视频终端制造商都各自添加了特定的转义序列用于执行一些特殊操作，比如把光标置于屏幕上的某个位置。举例来说，VT52终端允许通过发送ESC字符、y字符，后面跟上两个等于x,y位置的数值加上32的字符（这是为了从ASCII空格字符开始，并避开控制字符），将光标置于屏幕上的x,y位置。
由于这些序列对于不同的终端并不一样，因此人们不得不开发了一些复杂的库（比如termcap）和实用程序（比如tput），以便程序可以使用同一套API应对各种终端。另外，在很多终端中需要借助字符的二进制值发送数字（如行和列）。对于某些编程语言，以及内部不使用ASCII的系统来说，把数字转换为正确的字符常常是有困难的，甚至完全做不到。
ANSI标准试图解决这些问题。标准制订了一种所有终端共享的指令集，并要求用ASCII的数字字符传递所有数值信息。该系列的第一个标准是1976年通过的ECMA-48。它是一系列字符编码标准的延续，其中第一个是从1965年的ECMA-6，一个7位标准，ISO 646就源自此标准。“ANSI转义序列”的名称可以追溯到1979年ANSI采用ANSI X3.64。此外，ANSI X3L2委员会与ECMA委员会TC 1合作制订了一个几乎一模一样的标准。以上两个标准合并为ISO 6429的国际标准。1994年，ANSI取消了其标准，以支持国际标准。
第一个支持这个标准的流行视频终端是1978年推出的Digital VT100。这个终端在市场上非常成功，引发了各种各样的仿制品，其中最早和最流行的是1979年的Zenith Z-19。其他品牌还有Qume QVT-108，Televideo TVI-970，Wyse WY-99GT。另外，许多其他品牌的终端也不同程度地兼容可选的“VT100”、“VT103”或“ANSI”模式。 随着越来越多的软件（尤其是BBS系统）普及，越来越多的软件依赖转义序列起作用，导致几乎所有新的终端和终端模拟器都支持了此标准。
1981年，ANSI X3.64被美国政府采用（FIPS 86）。后来，美国政府停止复制行业标准，所以FIPS 86又被撤回了。
ECMA-48已经经历了多次更新换代，当前是从1991年开始的第5版。它也被ISO和IEC用作标准ISO/IEC 6429。

平台支持

随着诸多BBS和线上服务广泛使用ANSI，到20世纪80年代中期，ANSI几乎得到了全平台支持。尽管许多操作系统在标准文本输出中越来越多地支持ANSI，但大多数情况下是以终端模拟器的形式（例如Unix上的xterm，或MacOS上的OS X Terminal或ZTerm，以及IBM PC上的许多通信程序）。
Unix和AmigaOS都在操作系统中包含了对ANSI的一些支持，导致在这些平台上运行的程序广泛使用ANSI。 类Unix操作系统可以通过像termcap和curses库之类的库来生成ANSI代码，许多软件使用这些库升级显示方式。这些库也应该支持非ANSI终端，但是现在很少有人测试，所以很可能已经不起作用了。许多游戏和shell脚本直接输出ANSI序列（如彩色的提示信息），因此无法在不支持ANSI的终端上运行。
AmigaOS不仅支持输出到屏幕上的文本使用ANSI序列，打印机驱动程序也支持（用AmigaOS的专有扩展），并将它们转换为与特定打印机实际通信所需的代码。
尽管ANSI很普及，却并没有得到全平台支持。比如原始的“经典”Mac OS就没有内置对ANSI的支持，再比如Atari ST使用的是VT52改编的命令系统，用一些扩展程序支持颜色显示。

Windows和DOS

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派生系统中用于在NTVDM下执行的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变得更容易。

24位

随着16位到24位颜色的“真彩色”显卡的普及，Xterm、KDE的Konsole，以及所有基于libvte的终端（包括GNOME终端）支持了ISO-8613-3的24位前景色和背景色设置。
   ESC[ … 38;2;<r>;<g>;<b> … m选择RGB前景色ESC[ … 48;2;<r>;<g>;<b> … m选择RGB背景色
作为ISO / IEC国际标准8613-6采用的ITU的T.416信息技术-开放文档体系结构（ODA）和交换格式：字符内容体系结构给出了一个似乎不太受支持的替代版本：
   ESC[ … 38:2:<Color-Space-ID>:<r>:<g>:<b>:<unused>:<CS tolerance>:<Color-Space: 0="CIELUV"; 1="CIELAB">m选择RGB前景色ESC[ … 48:2:<Color-Space-ID>:<r>:<g>:<b>:<unused>:<CS tolerance>:<Color-Space: 0="CIELUV"; 1="CIELAB">m选择RGB背景色
请注意，这里使用了保留的“:”字符来分隔子选项，这可能是在实际实现中造成混淆的始作俑者。它还使用“3”作为第二个参数来指定使用青-品红-黄方案的方案，“4”用于青-品红-黄-黑的方案，后者使用上面标记为“unused”（“未使用”）的位置作为黑色组件。
还要注意，许多识别“:”作为分隔符的实现错误地忽视了色彩空间标识符参数，并因此改变了其余部分的位置。

示例

CSI 2 J — 清除屏幕、（在某些设备上）把光标置于1,1位置（左上角）。
CSI 32 m — 使文字呈绿色。在MS-DOS上，一般绿色是暗淡的绿色，可以用CSI 1 m启用粗体使其变成明亮的绿色，或者将两者合并为CSI 32 ; 1 m。MS-DOS ANSI.SYS用粗体状态使字符变亮，闪烁状态（通过INT 10, AX 1003h, BL 00h)使背景色变成明亮模式。MS-DOS ANSI.SYS并不直接支持SGR代码90–97和100–107。
CSI 0 ; 6 8 ; "DIR" ; 13 p — 重新分配F10键的功能为发送字符串“DIR”和回车符到键盘缓存中，在DOS命令行里会显示当前目录的内容（仅MS-DOS ANSI.SYS）。这种序列有时用于“ANSI炸弹”。这是一个私用编码（如字母p所示），用非标准的扩展使其包含一个字符串参数。如果按标准，会认为字母D是序列的末尾。
CSI s — 保存光标的位置。用序列CSI u会把光标重置回这个位置。假设当前的光标位置是7（y）、10（x）。序列CSI s会保存这两个数值。现在可以把光标移动到其他位置，比如用序列CSI 20 ; 3 H或CSI 20 ; 3 f把光标移动到20（y）、3（x）。现在如果用序列CSI u，光标会回到7（y）、10（x）。某些终端需要使用DEC序列ESC 7/ESC 8，这得到了更广泛的支持。

使用Shell脚本的示例

ANSI转移代码常常用于UNIX和类UNIX终端，以提供语法高亮功能。例如，在兼容的终端上，以下ls命令按类型对文件和目录的名称进行颜色编码。
ls --color
用户可以在脚本中使用转义码，将其作为标准输出或标准错误输出的一部分。例如，下面的GNU sed命令通过反显“WARN”开头的单词的行，以及使用暗红色背景色和亮黄色前景色显示以“ERR”开头的单词（字母大小写被忽略）的行来修饰make命令的输出。突出显示了设置ANSI代码的部分。
make 2>&1 | sed -e 's/.*\bWARN.*/\x1b[7m&\x1b[0m/i' -e 's/.*\bERR.*/\x1b[93;41 m&\x1b[0m/i'
以下Bash函数会使终端闪烁（通过交替发送反相和正常显示模式代码），直到用户按下任意键。这个函数可以用于当一个冗长的命令终止时提醒用户，用法如make; flasher。
flasher () { while true; do printf \\e[?5h; sleep 0.1; printf \\e[?5l; read -s -n1 -t1 && break; done; }
下面这个命令可以重置控制台，类似现代Linux系统的reset命令。然而，即使在较早的Linux系统和其他（非Linux）UNIX变体上，也应该能起作用。
printf \\033c