版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
版权
C语言控制终端文字颜色,使用的比较多的是这样一条命令:
printf("\033[1;30;47m hello word \033[m \n");
不免好奇,这个格式是如何来的?
作为C语言的使用者,从习惯上也不太喜欢\033这种写法啊,换成\x1B如何?
上面的语句,即使写成
printf("\e[1;30;47m hello word\e[m\n");
在我的电脑上也是起作用的,为何不写\e却要记忆那个\033,难道因为\033好记?(或许比\x1B好记)我想这不太可能吧
一、这个格式是怎么来的?
ECMA-48 标准 《Control Functions for Coded Character Sets 》
ECMA是European Computer Manufacturers Association,而这个标准也是 ISO/IEC 6429。
先看一眼 5.4 Control sequences (Page 10), 这里是基本格式
8.3.117 SGR - SELECT GRAPHIC RENDITION (Page 61)
中给出了我们用的这条指令的详细格式 CSI Ps… 06/13
首先 \e 或者 \033 或者 \x1B 作为起始字符,起始都是一个意思
CSI 就是那个[,可以再5.3节的表 05/11 找到
Ps… 的指令是我们要执行的比如颜色、高亮、加粗、闪烁等等
最后的06/13就是结束符m了。
为何要写成\033,换成\x1B如何?
对于C语言来说,其实都是一样的,因为编译器会把这些代码解释成相同的字符。
之所以会写成\033,个人认为源于POSIX标准的echo只支持 \0NNN 的写法。
如果直接在bash下执行
echo-e"\e[1;30;47m hello word \e[m \n"
这个是没有问题的(-e表示需要转换escape sequence,否则将会把\原样打出来)
但是如果在dash下执行(很多系统的默认sh重定向)
则必须使用
echo"\033