ANSI 控制码

转载:

之前一直好奇如何在终端输出不同颜色的文本以及如何任意改变终端光标的位置,今天才知道原来用到了 ANSI 控制码。

参考资料:

控制字符

控制字符(Control Character),出现于特定的信息文本中,表示某一控制功能的字符。

在 ASCII码中,第0~31号及第127号(共33个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。

US-ASCII控制字符

Seq

十进

十六进

缩写

字符名

 

00

0x00

NUL

Null (空)

^A

01

0x01

SOH

Start of Heading (报头开始)

^B

02

0x02

STX

Start of Text (正文开始)

^C

03

0x03

ETX

End of Text (正文结束)

^D

04

0x04

EOT

End of Transmission (传输结束)

^E

05

0x05

ENQ

Enquiry (查询)

^F

06

0x06

ACK

Acknowledge (确认)

^G

07

0x07

BEL

Bell (振铃)

^H

08

0x08

BS

Backspace (退格)

^I

09

0x09

HT

Horizontal Tab (水平制表)

^J

10

0x0A

LF

Line Feed (馈行)

^K

11

0x0B

VT

Vertical Tab (垂直制表)

^L

12

0x0C

FF

Form Feed (馈页)

^M

13

0x0D

CR

Carriage Return (回车)

^N

14

0x0E

SO

Shift Out (移出)

^O

15

0x0F

SI

Shift In (移入)

^P

16

0x10

DLE

Data Link Escape (数据链路转义)

^Q

17

0x11

DC1

Device Control 1 (设备控制1)

^R

18

0x12

DC2

Device Control 2 (设备控制2)

^S

19

0x13

DC3

Device Control 3 (设备控制3)

^T

20

0x14

DC4

Device Control 4 (设备控制4)

^U

21

0x15

NAK

Negative Acknowledge (否认)

^V

22

0x16

SYN

Synchronous Idle (同步空闲)

^W

23

0x17

ETB

End of Transmission Block (传输块结束)

^X

24

0x18

CAN

Cancel (取消)

^Y

25

0x19

EM

End of Medium (介质结束)

^Z

26

0x1A

SUB

Substitute (替换)

^[

27

0x1B

ESC

Escape (转义)

^\

28

0x1C

FS

File Separator (文件分隔符)

^]

29

0x1D

GS

Group Separator (分组符)

^^

30

0x1E

RS

Record Separator (记录分隔符)

^_

31

0x1F

US

Unit Separator (单元分隔符)

 

127

0x7F

DEL

Delete (删除)

控制字符,即 ASCII 控制码。ASCII 码小于 32 的字符都是控制字符。在 ASCII 中常用的控制字符包括:

名称含义ASCII 码键盘映射作用
BELbell0x07Ctrl+G铃声
BSbackspace0x08Ctrl+H后退一格
HThorizontal tab0x09Ctrl+I跳至下一个制表位
LFline feed0x0ACtrl+J换行
CRcarriage return0x0DCtrl+M回车
ESCescape0x1BCtrl+[开始一个转义序列

在键盘上如何映射控制字符:按下 Ctrl 键和某个字符键,将该字符键 ASCII 编码字节的7位中,左起的两位强制定为0,从而产生出32个 ASCII 控制码之一。例如,按下 Ctrl 和字母 G(十进制编码为71,二进制为01000111),产生编码7(振铃符,十进制编码7,或二进制00000111)。 键盘上有些单个键能产生控制码。例如 Backspace 键通常产生编码8,Tab 是编码9,Enter 是编码13(有些键盘上 Enter 可能是编码10)。

控制序列

控制序列,即 ANSI 控制码。大多数终端模拟器(Unix,Linux,Windows)都支持 ANSI 控制码。ANSI 控制码以 ESC 字符(ASCII 27/0x1b/033)开头,对于两个字符的 ANSI 控制码,第二个字符范围是 ASCII 64-95 (‘@’-‘_’),然而大多数 ANSI 控制码都多于两个字符,并且以 ESC 和 [ 开头,这时将 ESC+[ (即 “\033[“)称为 CSI(Control Sequence Introducer),这些控制码最后一个字符范围是 ASCII 64-126 (‘@’-‘~’)。还有一种单字符 CSI (155/0x9B/0233),但是不如 ESC+[ 用的多,而且可能不被某些设备支持。

1. 非 CSI 序列

部分非 CSI 序列:

序列名称作用
ESC cRIS重绘屏幕
ESC DIND换行
ESC ENEL新的一行
ESC HHTS设置当前列为制表位
ESC 7DECSC存储当前状态(光标坐标,属性,字符集)
ESC 8DECRC恢复上一次储存的设置
ESC % 开始一个字符集选择序列
ESC ( 开始一个 G0 字符集定义序列
ESC ) 开始一个 G1 字符集定义序列
ESC >DECPNM设置数字小键盘模式
ESC =DECPAM设置程序键盘模式
ESC ]OSC操作系统命令

有些控制序列效果可能与单个控制字符相同。

2. CSI 序列

CSI 序列的基本结构是:

CSI n1 ; n2... letter

最后一个字符 letter 决定 CSI 序列的动作。n1 ; n2.. 等参数是可选的,省略时将采用缺省值,一般是0或1。可以用一个问号代替参数序列。

部分 CSI 序列:

序列名称作用
CSI n ACUU光标上移n个单位
CSI n BCUD光标下移n个单位
CSI n CCUF光标前移n个单位
CSI n DCUB光标后移n个单位
CSI n ECNL光标下移到第n行的第1列
CSI n FCPL光标上移到第n行的第1列
CSI n GCHA光标移动到当前行的指定列
CSI n ; m HCUP光标移动到指定行和列(以1行1列为参照)
CSI n JED删除屏幕内容,0光标后(默认),1光标前,2全屏幕
CSI n KEL删除行内容,0光标后(默认),1光标前,2整行
CSI n SSU页面向上滚动n行
CSI n TSD页面向下滚动n行
CSI n ; m fHVP光标移动到指定行和列(以1行1列为参照)
CSI n mSGR设置SGR参数,包括文本、背景颜色
CSI 6 nDSR设备状态报告
CSI sSCP保存光标位置
CSI uRCP恢复光标位置
CSI ?25lDECTCEM隐藏光标
CSI ?25hDECTCEM显示光标

SGR 部分参数:

作用
0重置所有属性
1设置高亮度
4打开下划线
5闪烁
7反转视频,交换前景色与背景色
22设置正常亮度
24关闭下划线
25不闪烁
27关闭反转视频
30-37设置前景色
39设置默认前景色
40-47设置背景色
49设置默认背景色

颜色0-7依次为:Black,Red,Green,Yellow,Blue,Magenta,Cyan,White。

实例

1. 用于 C 语言 printf

printf("\033[41;32m 字体背景是红色,字是绿色 \033[0m\n"); 
  • 可设置为宏以方便使用:
#define NONE         "\033[m"
#define RED          "\033[0;31m"
#define LIGHT_RED    "\033[1;31m"
#define GREEN        "\033[0;32m"
#define LIGHT_GREEN  "\033[1;32m"
//...
printf( RED "current function is %s " GREEN " file line is %d\n" NONE, __FUNCTION__, __LINE__ );

2. Shell 脚本中使用,echo -e

echo -ne "\033[32mtest\033[0m"                 # 显示绿色文字
echo -ne "\033[3;1H123"                        # 可以将光标移到第3行第1列处
export PS1="\[\e[34m\][\u@\h \W]\$ \[\e[0m\]"  # 修改PS1,用法稍有不同

显示旋转的光标,表示等待:

#!/bin/bash
charset=('|' '/' '-' '\')
i=0
echo -ne "\033[?25l"
while true; do
    echo -n "${charset[((i%4))]}"
    echo -ne "\033[1D"
    ((i++))
    sleep 0.2
done

除此之外,还可以做一个字符进度条,像 wget 那样,甚至可以写一个终端下的俄罗斯方块!

3. 设置 OSX 终端按键功能

打开终端,进入偏好设置,’设置’ -> ‘键盘’。

  1. Home 键:选择 ‘将字符串发送到shell’,设置字符串为 \001(Ctrl+A)。
  2. End 键:同样设置字符串为 \005(Ctrl+E)。
  3. Pg Up 键:同样设置字符串为 \033[5~(Esc[5~)。
  4. Pg Dn 键:同样设置字符串为 \033[6~(Esc[6~)。


本作品由转载自 liberize 创作,采用 CC BY-NC-SA 3.0 许可协议进行许可。 

原文链接: http://liberize.github.io/tech/ansi-escape-code.html

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值