硬汉嵌入式论坛

 找回密码
 立即注册
查看: 271|回复: 0
收起左侧

[技术分享] ANSI Escape Codes 字符终端颜色格式控制

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115985
QQ
发表于 2025-5-8 11:36:37 | 显示全部楼层 |阅读模式
https://en.wikipedia.org/wiki/ANSI_escape_code

简介:

ANSI 转义序列(ANSI escape sequences)是一种带内信令(in-band signaling)标准,用于控制视频文本终端(video text terminals)和终端模拟器(terminal emulators)上的光标位置、颜色、字体样式等选项。这些序列通常以 ASCII 转义字符(ESC,即 \x1B 或 \033) 和左方括号 [ 开头,并嵌入在文本中。终端会将这些序列解析为控制命令,而非普通文本显示。

ANSI 转义序列于 20 世纪 70 年代 推出,旨在取代各厂商私有的控制序列,并在 80 年代初期 广泛普及于计算机设备市场。尽管在 21 世纪,硬件文本终端已逐渐减少,但 ANSI 标准仍然至关重要,因为绝大多数终端模拟器(如 Linux/Unix 终端、Windows Terminal)和命令行控制台(如 CMD、PowerShell)至少支持部分 ANSI 标准。

2016年,微软在Windows 10版本1511更新中出人意料地实现了对ANSI转义序列的支持——此时距离Windows系统问世已过去三十余年。这项改进与"Windows Linux子系统"同步推出,显然是为了让基于Unix终端的软件能够适配Windows控制台环境。Windows PowerShell 5.1默认启用了该功能,而PowerShell 6更是允许开发者通过`e在字符串中直接嵌入ESC转义字符。

2019年推出的Windows Terminal终端模拟器已默认支持这些控制序列。微软已明确表示计划用Windows Terminal逐步取代传统的Windows控制台。

控制字符

几乎所有用户都会使用某些单字节字符的功能。最初作为ASCII标准的一部分,默认的C0控制字符集现已被纳入ISO 6429(ECMA-48)标准规范,使其与ANSI转义序列调用的C1字符集同属一个标准体系(尽管ISO 2022标准允许单独使用ISO 6429 C0字符集而不必搭配C1字符集,反之亦然,前提是0x1B必须始终代表ESC转义字符)。这种设计既能减少数据传输量,又能实现一些转义序列无法完成的功能:

123.png

转义序列的长度不固定。符合ANSI标准的转义序列通用格式由ANSI X3.41(等同于ECMA-35或ISO/IEC 2022)标准定义[13]:13.1。这些转义序列仅包含0x20-0x7F范围内的字节(即所有非控制ASCII字符),且无需预读即可解析。若在序列结束前遇到控制字符、设置了高位的字节或任何无效序列字节,其行为是未定义的。

Fe Escape sequences

若转义字符ESC后跟随0x40至0x5F范围内的字节(即ASCII字符@A-Z[]^_),则该转义序列属于Fe类型。其解析逻辑遵循适用的C1控制码标准[13]:13.2.1。因此,所有符合ANSI X3.64/ECMA-48标准的C1控制码转义序列均采用此格式[14]:5.3.a。

8位环境下的编码规范:

标准规定在8位编码环境中:Fe类型转义序列对应的控制功能,可用0x80-0x9F范围内的单字节直接表示[14]:5.3.b

实现条件:需采用符合ISO 2022标准的8位编码(如ISO 8859系列字符集)

典型应用场景:传统终端设备、工业控制系统

现代编码环境限制:

UTF-8/CP-1252等现代编码中:

0x80-0x9F范围被重新定义用途(如Windows-1252用于扩展拉丁字符)

导致必须使用两字节ESC序列表示C1控制码

UTF-8的特殊情况:

通过C1控制和拉丁语补充区块(U+0080至U+009F)表示时

实际生成不同的两字节编码(如U+008E对应0xC2 0x8E)

不仅无法节省存储空间,反而增加编码复杂度

1.png

控制序列引导符(CSI)指令

对于控制序列引导符(Control Sequence Introducer,CSI)指令,其标准格式为:

起始符:ESC [(在编程语言中可表示为 \e[、\x1b[ 或 \033[)

参数字节(0-多个):范围 0x30–0x3F(ASCII字符:0-9:;<=>?)

中间字节(0-多个):范围 0x20–0x2F(ASCII字符:空格及 !"#$%&'()*+,-./)

结束字节(1个):范围 0x40–0x7E(ASCII字符:@A-Z[\]^_\a-z{|}~`)[14]:&#8202;5.4&#8202;

参数处理规则:

通用序列使用分号分隔的数字参数(如 1;2;3)[14]:&#8202;5.4.2&#8202;

缺省参数视为0:

1;;3 等效于 1;0;3

无参数的 ESC[m 等效于重置指令 ESC[0m

部分指令(如光标上移CUU)将0视为1以优化缺省场景[14]:&#8202;F.4.2&#8202;

私有序列保留范围:

参数字节 <=>? 或结束字节 0x70–0x7E(p-z{|}~)被划定为厂商私有区域

允许终端制造商自定义指令而不与标准冲突

异常处理机制:
当CSI序列包含非法字符(超出0x20–0x7E范围)时:

可能包含:C0控制字符(0x00–0x1F)、DEL(0x7F)或高位字节

终端行为未定义,可能采取以下处理方式:

忽略非法字节

立即执行已解析部分

中止当前CSI序列

继续处理后续字节
(需参考具体终端实现规范)[需要引用]

2.png

3.png

图形渲染选择参数(SGR)说明

控制序列 CSI n m(称为"图形渲染选择" - Select Graphic Rendition)用于设置显示属性。其参数规范如下:

多属性设置:

可在同一序列中设置多个属性

各属性间用分号分隔(如 CSI 31;1;4m)

示例:\033[31;1;4m → 红色、粗体、带下划线文本

属性持续特性:

设置的属性将持续生效

直到遇到新的SGR序列才会被重置

默认重置规则:

当未指定参数时(即 CSI m)

系统自动视为 CSI 0 m(重置所有属性)

等效指令:\033[0m(恢复正常显示状态)

1.png

颜色

2.png

3.png

4.png

5.png

6.png

7.png


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-1 09:45 , Processed in 0.304897 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表