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[1;30;47m hello word \033[m \n"
因为\e和\xHH是GNU的标准,POSIX里面只支持\0NNN,所以为了兼容性,大家就都用\033吧
参考资料:
1. 一起talk C栗子吧(第一百六十七回:C语言实例–控制终端字符颜色) http://blog.csdn.net/talk_8/article/details/51764795
2. Linux终端和win32控制台文本颜色输出 http://www.cnblogs.com/crabxx/p/4046498.html
3. ECMA-48 标准 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf