[note] C语言控制终端,缘何使用“\033[m”

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值