ANSI 控制码

本文详细介绍了ASCII控制码和ANSI控制码的工作原理,包括如何在终端中改变文本颜色和光标位置。涵盖了控制字符、控制序列、CSI序列及其参数,如光标移动、屏幕清除等操作,并提供了C语言和Shell脚本的实例。
摘要由CSDN通过智能技术生成

转载:

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

参考资料:

控制字符

控制字符,即 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~)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值