概念

先看ANSI_escape_code官网上的一段介绍:

In computing, ANSI escape codes (or escape sequences) are a method using in-band signaling
to control theformatting, color, and other output options on video text terminals.To encode
this formatting information, certain sequences of bytes are embedded into the text,which the
terminal looks for and interprets as commands, not ascharacter codes.在计算机系统中,ANSI转义码(或转义序列)是一种使用带内信号控制视频文本终端的格式、颜色和其他输出选
项的方法。为了编码这种格式化信息,特定的字节序列被嵌入到文本中,终端将查找并将其解释为命令,而不
是字符代码。

终端,现在也叫命令行,在历史上,确实有一种设备就叫终端。其中最为著名的,可能就是 vt100 系列了。我们现在能看到的 terminal 软件都是终端设备的模拟器。虽说终端设备已经作古,但终端的通信控制协议依然有效。

ANSI转义序列就是终端上通用的通信控制协议,我们可以在命令行下显示粗体、斜体、下划线字符,也可以显示不同的颜色,甚至还能显示简单的动画。

ANSI序列是在二十世纪七十年代引入的标准,用以取代特定终端供应商的序列,并在二十世纪八十年代早期开始在计算机设备市场上广泛使用。与早期缺少光标移动功能的系统相比,新生的电子公告板系统(BBS)使用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改编的命令系统,用一些扩展程序支持颜色显示。

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变得更容易。

转义序列

序列具有不同的长度。所有序列都以ASCII字符ESC(十进制的27 ,或十六进制 0x1B,或八进制的033,或转义字符\e)开头,第二个字节则是0x40–0x5F(ASCII 的@A–Z[]^_)范围内的字符。

标准规定,在8位环境中,两个字节的序列可以合并为0x80-0x9F范围内的单个字节(详情请参阅C1控制字符集)。但是,在现代设备上,这些代码通常用于其他目的,例如UTF-8的一部分或CP-1252字符,因此并不使用这种合并的方式。

除ESC之外的其他C0代码(通常是BEL,BS,CR,LF,FF,TAB,VT,SO和SI)在输出时也可能会产生与某些控制序列相似或相同的效果。

ANSI转义序列C0列表

ANSI转义序列C1不完整列表

按下键盘上的特殊键,或向终端输出CSI、DCS或OSC请求序列,会产生从终端发送到计算机的CSI,DCS或OSC应答序列,就像用户使用键盘输入的一样。

CSI序列

ANSI转义序列中以 ESC [ 开头的叫作 Control Sequence Introducer,简写为 CSI。以 CSI 开头的指令有很多,大致可分四类:光标移动指令、清屏指令、字符渲染(Graphic Rendition)指令和终端控制指令。

CSI序列由ESC [、若干个(包括0个)“参数字节”、若干个“中间字节”,以及一个“最终字节”组成。各部分的字符范围如下:

组成部分 字符范围 ASCII
参数字节 0x30–0x3F 0–9:;<=>?
中间字节 0x20–0x2F 空格、!"#$%&’()*+,-./
最终字节 0x40–0x7E @A–Z[]^_`a–z{

所有常见的序列都只是把参数用作一系列分号分隔的数字,如1;2;3。缺少的数字视为0(如1;;3相当于中间的数字是0,ESC[m这样没有参数的情况相当于参数为0)。某些序列(如CUU)把0视为1,以使缺少参数的情况下有意义。

一部分字符定义是“私有”的,以便终端制造商可以插入他们自己的序列而不与标准相冲突。包括参数字节<=>?的使用,或者最终字节0x70–0x7F(p–z{|}~)例如VT320序列 CSI?25hCSI?25l 的作用是打开和关闭光标的显示。

当CSI序列含有超出0x20–0x7E范围的字符时,其行为是未定义的。这些非法字符包括C0控制字符(范围0–0x1F)、DEL(0x7F),以及高位字节。

一些CSI控制序列(不完整列表)

SGR

字符渲指令全称 Select Graphic Rendition,简写为 SGR。其格式为 CSI n m,以数字开头,并以 m 结尾,n 的取值范围是 0-107。又可以分成两类,一类控制字符显示样式,另一类控制显示颜色。

SGR参数列表

颜色设置

3/4位色

初始的规格只有8种颜色,只给了它们的名字。SGR参数30-37选择前景色,40-47选择背景色。相当多的终端将“粗体”(SGR代码1)实现为更明亮的颜色而不是不同的字体,从而提供了8种额外的前景色,但通常情况下并不能用于背景色,虽然有时候反显(SGR代码7)可以允许这样。

例如:

  • 在白色背景上显示黑色文字使用ESC[30;47m,
  • 显示红色文字用ESC[31m,
  • 显示明亮的红色文字用ESC[1;31m。
  • 重置为默认颜色用ESC[39;49m,
  • 重置所有属性用ESC[0m。

后来的终端新增了功能,可以直接用90-97和100-107指定“明亮”的颜色。当硬件开始使用8位DAC时,多个软件为这些颜色名称分配了24位的代码。下面的图表显示了发送到DAC的一些常用硬件和软件的值。

8位色

随着256色查找表在显卡上越来越常见,相应的转义序列也增加了,以从预定义的256种颜色中选择:

  • ESC[ … 38;5;n … m选择前景色
  • ESC[ … 48;5;n … m选择背景色
  • 0- 7:标准颜色(同ESC [ 30–37 m)
  • 8- 15:高强度颜色(同ESC [ 90–97 m)
  • 16-231:6 × 6 × 6 立方(216色): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
  • 232-255:从黑到白的24阶灰度色

ITU的T.416信息技术-开放文档体系结构(ODA)和交换格式:字符内容体系结构使用“:”作为分隔符:

  • ESC[ … 38:5:n … m选择前景色
  • ESC[ … 48:5:n … m选择背景色



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,这得到了更广泛的支持。

主要网址

ANSI_escape_code官网地址:https://en.wikipedia.org/wiki/ANSI_escape_code
ANSI/VT100 Terminal Control Escape Sequences :http://www.termsys.demon.co.uk/vtansi.htm
xterm:https://invisible-island.net/xterm/
stackoverflow:https://stackoverflow.com/questions/4842424/list-of-ansi-color-escape-sequences

ANSI转义序列详解相关推荐

  1. c语言中ANSI标准的关键字,C语言中32个关键字详解

    C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...

  2. 由ANSI标准定义的C语言关键字,C语言32个关键字详解

    C语言中32个关键字详解 由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register ...

  3. ASCII,GBK,Unicode(UTF-32/UTF-8),乱码,ANSI详解

    前言 总目录 日常开发过程中,经常会遇到ASCII,GBK,Unicode(UTF-32/UTF-8)等名词,对于这些概念是不是有点傻傻分不清呢?相信看下本文,你会有自己的理解. 一.ASCII码 1 ...

  4. UNICODE与UTF-8的转换详解

    UNICODE与UTF-8的转换详解 1 编码 在计算机中,各种信息都是以二进制编码的形式存在的,也就是说,不管是文字.图形.声音.动画,还是电影等各种信息,在计算机中都是以0和1组成的二进制代码表示 ...

  5. Python2.7字符编码详解

    Python2.7字符编码详解 目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3. ...

  6. 转1:Python字符编码详解

    Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...

  7. vscode中setting.json配置详解

    vscode中的setting.json配置文件配置详解 话不多说上配置文件 大家按需复制到自己的setting.json配置文件中即可 [{// 控制是否在编辑器中显示 CodeLens." ...

  8. C 语言教程详解——入门到精通

    C 语言是一种通用的.面向过程式的计算机程序设计语言.1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言. C 语言是一种广泛使用的计算机语言,它与 J ...

  9. JavaMail详解

    引用自http://blog.sina.com.cn/s/articlelist_1832656582_7_1.html [JavaMail]1 基础 A.简介 JavaMail,顾名思义,提供给开发 ...

最新文章

  1. Servlet 服务器端小程序
  2. poj 3723 Conscription (并查集)
  3. Python实现一个简单数据库查询接口编写
  4. Spring-Mybatis MapperScannerConfigurer 取不到PropertyPlaceholderConfigurer里的值
  5. 做操作系统的公司,为什么不能把系统安全做好?
  6. 前端学习(1486):postman测试接口
  7. Bundle Adjustment简述(转载)
  8. 动态规划|Dynamic Programming
  9. 聊一聊Python与C++的不同(一)
  10. sublime text插件与快捷键
  11. 数字后端基本概念-合集
  12. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_12_创建多线程程序的第二种方式_实现Runnable接口...
  13. 浅谈数据挖掘中的关联规则挖掘
  14. numpy 的三角函数运算
  15. 巨头特斯拉的进击之路
  16. 计算机网络教学改革方案,三教改革下的计算机网络专业教学改革
  17. 谷歌中国工程研究院原副院长王劲加盟百度
  18. 中国移动云能力中心IaaS产品部2021年招聘
  19. 微信支付当前页面的URL未注册问题[单页面]
  20. Chapter2.4:数学模型考研参考题

热门文章

  1. origin画图修改横坐标
  2. 2019届大疆提前批校招机器学习岗笔试B卷
  3. OIO、NIO、AIO小结
  4. jQuery Validate表单中文正则验证+手机号正则验证
  5. FAST角点检测算法(二)- 非极大值抑制筛选fast特征点
  6. win10c语言0xc0000142,Win10错误码0xc0000142怎么修复
  7. Pytorch学习笔记7——自定义数据集
  8. codeforces 1520E. Arranging The Sheep(1400)
  9. 基于DCT变换的JPEG图像压缩原理
  10. 漏洞管理平台-洞察贰