ANSI 转义序列(ANSI Escape Sequences)
本文转载自 Github Gist from "fnky/ANSI.md"。
下面是笔者翻译版本。持续更新中。已经更完。“(?)”符号表示不确定如何翻译。
ANSI 转义序列
标准 Esc 代码以 Escape
为前缀:
- Ctrl 快捷键:
^[
- 八进制:
\033
- Unicode:
\u001b
- 十六进制:
\x1B
- 十进制:
27
后面跟着命令,有时用左方括号([
)分隔,称为控制序列引导码(CSI),后面可选地跟着可选的参数和命令本身。
参数通过分号(;
)分隔,例如:
\x1b[1;31m # 设置样式为粗体,红字。
序列
ESC
- 以ESC
(\x1B
) 开头的序列CSI
- 控制序列引导码:以ESC [
或 CSI(\x9B
)开头的序列DCS
- 设备控制字串:以ESC P
或 DCS (\x90
)开头的序列OSC
- 操作系统命令:以ESC ]
或 OSC(\x9D
)开头的序列
序列和参数之间的空格应该被忽略。它们的存在是为了提高可读性。
普通 ASCII 码
名字 | 十进制 | 八进制 | 十六进制 | C 风格转义 | Ctrl 快捷键 | 描述 |
---|---|---|---|---|---|---|
BEL |
7 | 007 | 0x07 | \a |
^G |
终端响铃 |
BS |
8 | 010 | 0x08 | \b |
^H |
退格 |
HT |
9 | 011 | 0x09 | \t |
^I |
横向制表符(Tab) |
LF |
10 | 012 | 0x0A | \n |
^J |
换行 |
VT |
11 | 013 | 0x0B | \v |
^K |
纵向制表符(Tab) |
FF |
12 | 014 | 0x0C | \f |
^L |
换页 (即:New page NP ) |
CR |
13 | 015 | 0x0D | \r |
^M |
回车 |
ESC |
27 | 033 | 0x1B | \e * |
^[ |
字符 Esc |
DEL |
127 | 177 | 0x7F | <none> |
<none> |
字符 Delete |
注意:有些控制转义序列,比如
\e
表示ESC
,并不能保证在所有语言和编译器中都能正常工作。建议使用十进制、八进制或十六进制表示作为转义码。
注意:Ctrl 快捷键 表示方式只是将形如 ASCII 码 \(1\) 等的不可打印字符与 ASCII 码 \(65\)(“A”)等的可打印字符关联起来。ASCII 码 \(1\) 是
^A
(Ctrl-A),而 ASCII 码 \(7\)(BEL) 是^G
(Ctrl-G)。这是一种常见的表示和输入方式。历史上,它们来自于 VT 系列终端之一。
光标控制
转义序列码 | 描述 |
---|---|
ESC[H |
将光标移回 \((0,0)\) |
ESC[{line};{column}H 或 ESC[{line};{column}f |
光标移到 # 行 # 列 |
ESC[#A |
光标上移 # 行 |
ESC[#B |
光标下移 # 行 |
ESC[#C |
光标右移 # 列 |
ESC[#D |
光标左移 # 列 |
ESC[#E |
光标下移 # 行,移到行首 |
ESC[#F |
光标上移 # 行,移到行首 |
ESC[#G |
移动光标至列 # |
ESC[6n |
求光标位置 (以 ESC[#;#R 形式汇报) |
ESC M |
光标上移一行,按需可滚动 |
ESC 7 |
保存光标位置(DEC) |
ESC 8 |
将光标恢复到上次保存的位置(DEC) |
ESC[s |
保存光标位置(SCO) |
ESC[u |
将光标恢复到上次保存的位置(SCO) |
注意:有些序列,比如保存和恢复光标,是私有序列,没有标准化。虽然一些终端仿真器(即 xterm 和 derived)同时支持 SCO 和 DEC 序列,但它们可能具有不同的功能。因此,建议使用 DEC 序列。
擦除功能
转义序列码 | 描述 |
---|---|
ESC[J |
清屏(同 ESC\[0J )此处可能有误,应为 ESC\[2J |
ESC[0J |
从光标擦到屏尾 |
ESC[1J |
从光标擦到屏首 |
ESC[2J |
擦除整个屏幕 |
ESC[3J |
擦除保存的行(?) |
ESC[K |
整行擦除(同 ESC\[0K )此处可能有误,应为 ESC\[2K |
ESC[0K |
从光标擦到行尾 |
ESC[1K |
从光标擦到行首 |
ESC[2K |
擦除整个行 |
注意:擦除行不会移动光标,这意味着光标将停留在该行的原位。你可以在擦除行后使用
\r
,将光标返回到当前行开始处。
颜色 / 图形模式
转义序列码 | 对应的重置序列 | 描述 |
---|---|---|
ESC[1;34;{...}m |
设置单元格(?)的图形模式,用分号分隔 (; ). |
|
ESC[0m |
重置(消除)所有颜色和图形 | |
ESC[1m |
ESC[22m |
粗体 |
ESC[2m |
ESC[22m |
虚化(暗淡) |
ESC[3m |
ESC[23m |
斜体 |
ESC[4m |
ESC[24m |
下划线 |
ESC[5m |
ESC[25m |
闪烁 |
ESC[7m |
ESC[27m |
反向 |
ESC[8m |
ESC[28m |
隐形 |
ESC[9m |
ESC[29m |
删除线 |
注意:一些终端可能不支持上述模式。
注意:虚化和粗体模式都用
ESC[22m
序列重置。ESC[21m
序列是双下划线模式下的非指定序列,仅在某些终端中工作,并用ESC[24m
重置。
颜色码
大多数终端支持 8 色和 16 色,以及 256(8位)色。这些颜色由用户设置,但通常具有定义好的含义。
8-16 Colors
颜色名 | 前景色(字)码 | 背景色码 |
---|---|---|
黑 | 30 |
40 |
红 | 31 |
41 |
绿 | 32 |
42 |
黄 | 33 |
43 |
蓝 | 34 |
44 |
品红 | 35 |
45 |
青 | 36 |
46 |
白 | 37 |
47 |
默认 | 39 |
49 |
重置 | 0 |
0 |
注意: 重置 色重置所有颜色、字体效果,默认 色只重置颜色。
大多数终端除了基本的 \(8\) 种颜色外,还支持“明亮”或“大胆”的颜色。它们有自己的一套代码,与正常的颜色镜像,但在代码中有一个额外的 ;1
:
# 设置样式为粗体,红色字(前景色)。 \x1b[1;31mHello # 设置样式为暗淡的白色字(前景色),红色背景。 \x1b[2;37;41mWorld
支持 aixterm 规范 的终端提供明亮版本的 ISO 颜色,不需要使用 bold 修饰符:
颜色名 | 前景(字)色码 | 背景色码 |
---|---|---|
亮黑 | 90 |
100 |
亮红 | 91 |
101 |
亮绿 | 92 |
102 |
亮黄 | 93 |
103 |
亮蓝 | 94 |
104 |
亮品红 | 95 |
105 |
亮青 | 96 |
106 |
亮白 | 97 |
107 |
256 色
下面的转义码告诉终端使用给定的颜色 ID:
转义序列码 | 描述 |
---|---|
ESC[38;5;{ID}m |
设置前景色 |
ESC[48;5;{ID}m |
设置背景色 |
其中的 {ID}
应该用下面颜色表中从 \(0\) 到 \(255\) 的颜色索引替换:
该表从最初的 \(16\) 种颜色(\(0\sim 15\))开始。
接下来的 \(216\) 种颜色 \((16-231)\) 可能由偏移 \(16\) 的 3bpc RGB 值组成,打包成一个值。(?)
最后的 \(24\) 种颜色是灰度色,从比黑色稍浅的颜色开始,一直到比白色稍深的颜色。
一些仿真器(?)将这些步骤解释为所有三个通道(RGB)上的线性增量(256/24
),尽管一些仿真器可以明确定义这些值。
注:上图可以用以下 Python 2 代码生成
import sys for i in range(0, 16): for j in range(0, 16): code = str(i * 16 + j) sys.stdout.write(u"\u001b[38;5;" + code + "m " + code.ljust(4)) print u"\u001b[0m"
RGB 色
更多摩登的终端支持真彩色(\(24\) 位 RGB),它允许你用 RGB 设置(前景、背景)颜色。
这些转移序列通常不规范。
转义序列码 | 描述 |
---|---|
ESC[38;2;{r};{g};{b}m |
用 RGB 设置前景色。 |
ESC[48;2;{r};{g};{b}m |
用 RGB 设置背景色。 |
注意:
;38
和;48
对应 \(16\) 种颜色序列,终端将其分别解释为设置前景色和背景色。其中,;2
和;5
设置颜色格式。
画面模式
设置模式
转义序列码 | 描述 |
---|---|
ESC[={value}h |
将屏幕宽度或类型更改为由值指定的模式。 |
ESC[=0h |
\(40 \times 25\) 黑白(文本) |
ESC[=1h |
\(40 \times 25\) 彩色(文本) |
ESC[=2h |
\(80 \times 25\) 黑白(文本) |
ESC[=3h |
\(80 \times 25\) 彩色(文本) |
ESC[=4h |
\(320 \times 200\) 4 色(图形) |
ESC[=5h |
\(320 \times 200\) 黑白(图形) |
ESC[=6h |
\(640 \times 200\) 黑白(图形) |
ESC[=7h |
启用自动换行 |
ESC[=13h |
\(320 \times 200\) 彩色(图形) |
ESC[=14h |
\(640 \times 200\) 彩色(16 色图形) |
ESC[=15h |
\(640 \times 350\) 黑白(2 色图形) |
ESC[=16h |
\(640 \times 350\) 彩色(16 色图形) |
ESC[=17h |
\(640 \times 480\) 黑白(2 色图形) |
ESC[=18h |
\(640 \times 480\) 彩色(16 色图形) |
ESC[=19h |
\(320 \times 200\) 彩色(256 色图形) |
ESC[={value}l |
使用与设置模式相同的值重置模式,但 7 除外,它将禁用自动换行。该转义序列的最后一个字符是小写 \(\texttt{L}\)。 |
常见的专用模式
以下是一些专用模式的示例,这些模式没有在规范中定义,但在大多数终端中都能实现。
转义序列码 | 描述 |
---|---|
ESC[?25l |
隐藏光标 |
ESC[?25h |
显示光标 |
ESC[?47l |
恢复屏幕 |
ESC[?47h |
保存屏幕 |
ESC[?1049h |
启用替代缓冲区 |
ESC[?1049l |
禁用替代缓冲区 |
有关 XTerm 定义的专用模式的更详细列表,请参阅 XTerm 控制序列。
注意: 虽然大多数终端都支持这些模式,但有些模式可能无法在 tmux 等多路复用器(?)中使用。
键盘字符串(?)
ESC[{code};{string};{...}p
将键盘按键重定义为指定字符串。
此转义序列的参数定义如下:
code
是下表中列出的一个或多个值。这些值代表键盘按键和按键组合。在命令中使用这些值时,除了转义序列所需的分号外,还必须键入表中所示的分号。某些键盘无法使用括号中的代码。除非在ANSI.SYS
的DEVICE
命令中指定/X
开关,否则ANSI.SYS
不会为这些键盘解释括号中的代码。string
既可以是单个字符的 ASCII 代码,也可以是包含在引号中的字符串。例如,65
和"A"
都可以用来表示大写 \(\texttt{A}\)。
重要:下表中的某些值并非对所有计算机都有效。请查阅计算机文档以了解不同的值。
键盘字符串表
键 | 码 | SHIFT+键 码 | CTRL+键 码 | ALT+键 码 |
---|---|---|---|---|
F1 | 0;59 | 0;84 | 0;94 | 0;104 |
F2 | 0;60 | 0;85 | 0;95 | 0;105 |
F3 | 0;61 | 0;86 | 0;96 | 0;106 |
F4 | 0;62 | 0;87 | 0;97 | 0;107 |
F5 | 0;63 | 0;88 | 0;98 | 0;108 |
F6 | 0;64 | 0;89 | 0;99 | 0;109 |
F7 | 0;65 | 0;90 | 0;100 | 0;110 |
F8 | 0;66 | 0;91 | 0;101 | 0;111 |
F9 | 0;67 | 0;92 | 0;102 | 0;112 |
F10 | 0;68 | 0;93 | 0;103 | 0;113 |
F11 | 0;133 | 0;135 | 0;137 | 0;139 |
F12 | 0;134 | 0;136 | 0;138 | 0;140 |
HOME(数字键盘) | 0;71 | 55 | 0;119 | -- |
UP ARROW(数字键盘) | 0;72 | 56 | (0;141) | -- |
PAGE UP(数字键盘) | 0;73 | 57 | 0;132 | -- |
LEFT ARROW(数字键盘) | 0;75 | 52 | 0;115 | -- |
RIGHT ARROW(数字键盘) | 0;77 | 54 | 0;116 | -- |
END(数字键盘) | 0;79 | 49 | 0;117 | -- |
DOWN ARROW(数字键盘) | 0;80 | 50 | (0;145) | -- |
PAGE DOWN(数字键盘) | 0;81 | 51 | 0;118 | -- |
INSERT(数字键盘) | 0;82 | 48 | (0;146) | -- |
DELETE(数字键盘) | 0;83 | 46 | (0;147) | -- |
HOME | (224;71) | (224;71) | (224;119) | (224;151) |
UP ARROW | (224;72) | (224;72) | (224;141) | (224;152) |
PAGE UP | (224;73) | (224;73) | (224;132) | (224;153) |
LEFT ARROW | (224;75) | (224;75) | (224;115) | (224;155) |
RIGHT ARROW | (224;77) | (224;77) | (224;116) | (224;157) |
END | (224;79) | (224;79) | (224;117) | (224;159) |
DOWN ARROW | (224;80) | (224;80) | (224;145) | (224;154) |
PAGE DOWN | (224;81) | (224;81) | (224;118) | (224;161) |
INSERT | (224;82) | (224;82) | (224;146) | (224;162) |
DELETE | (224;83) | (224;83) | (224;147) | (224;163) |
PRINT SCREEN | -- | -- | 0;114 | -- |
PAUSE/BREAK | -- | -- | 0;0 | -- |
BACKSPACE | 8 | 8 | 127 | (0) |
ENTER | 13 | -- | 10 | (0 |
TAB | 9 | 0;15 | (0;148) | (0;165) |
NULL | 0;3 | -- | -- | -- |
A | 97 | 65 | 1 | 0;30 |
B | 98 | 66 | 2 | 0;48 |
C | 99 | 66 | 3 | 0;46 |
D | 100 | 68 | 4 | 0;32 |
E | 101 | 69 | 5 | 0;18 |
F | 102 | 70 | 6 | 0;33 |
G | 103 | 71 | 7 | 0;34 |
H | 104 | 72 | 8 | 0;35 |
I | 105 | 73 | 9 | 0;23 |
J | 106 | 74 | 10 | 0;36 |
K | 107 | 75 | 11 | 0;37 |
L | 108 | 76 | 12 | 0;38 |
M | 109 | 77 | 13 | 0;50 |
N | 110 | 78 | 14 | 0;49 |
O | 111 | 79 | 15 | 0;24 |
P | 112 | 80 | 16 | 0;25 |
Q | 113 | 81 | 17 | 0;16 |
R | 114 | 82 | 18 | 0;19 |
S | 115 | 83 | 19 | 0;31 |
T | 116 | 84 | 20 | 0;20 |
U | 117 | 85 | 21 | 0;22 |
V | 118 | 86 | 22 | 0;47 |
W | 119 | 87 | 23 | 0;17 |
X | 120 | 88 | 24 | 0;45 |
Y | 121 | 89 | 25 | 0;21 |
Z | 122 | 90 | 26 | 0;44 |
1 | 49 | 33 | -- | 0;120 |
2 | 50 | 64 | 0 | 0;121 |
3 | 51 | 35 | -- | 0;122 |
4 | 52 | 36 | -- | 0;123 |
5 | 53 | 37 | -- | 0;124 |
6 | 54 | 94 | 30 | 0;125 |
7 | 55 | 38 | -- | 0;126 |
8 | 56 | 42 | -- | 0;126 |
9 | 57 | 40 | -- | 0;127 |
0 | 48 | 41 | -- | 0;129 |
- | 45 | 95 | 31 | 0;130 |
= | 61 | 43 | -- | 0;131 |
[ | 91 | 123 | 27 | 0;26 |
] | 93 | 125 | 29 | 0;27 |
92 | 124 | 28 | 0;43 | |
; | 59 | 58 | -- | 0;39 |
' | 39 | 34 | -- | 0;40 |
, | 44 | 60 | -- | 0;51 |
. | 46 | 62 | -- | 0;52 |
/ | 47 | 63 | -- | 0;53 |
` | 96 | 126 | -- | (0;41) |
ENTER(主键盘) | 13 | -- | 10 | (0;166) |
/(主键盘) | 47 | 47 | (0;142) | (0;74) |
*(主键盘) | 42 | (0;144) | (0;78) | -- |
-(主键盘) | 45 | 45 | (0;149) | (0;164) |
+(主键盘) | 43 | 43 | (0;150) | (0;55) |
5(主键盘) | (0;76) | 53 | (0;143) | -- |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程