2008年3月25日星期二

[PHP]在bash中输出彩色文本

先看图吧:

PHP在bash中输出彩色文本

乱不乱?这是我自己用的一个web游戏机器人程序的输出,游戏自然一切都是数字说了算,可每次看这一大堆数字实在是让我头疼,从中找出有用的数据太难了,对齐、缩进都办法也不怎么见效,突然我想到,如果用escape color输出彩色的文本,应该看起来会舒服很多吧?

说到escape color,用过bash的人应该都见过,只是不知道它叫这么名字而已。ls中彩色的文件、目录名就是用escape color来实现的。早些年用得比较多的telnet形式的bbs,它的颜色也是escape color,最明显的特征就是bbs文章被转贴到别处的时候,经常会多出一些ESC什么的字符出来,这就是escape color的控制字符。

想完整的了解escape color,资料很多,wikipedia - ANSI escape code就有比较完整的解释,中文的资料也不少,比如啦啦~在bash下输出彩色的文本,甚至还有人做出了颜色表:The 256 color mode of xterm

不用觉得眼花缭乱,简单说来,escape code就是在终端(terminal)中输出的控制字符,不光包括文字颜色,还可以控制很多其它内容,当然,颜色是比较常用的,所以习惯称之为escape color。我在这里也只讲颜色,其它控制字符的使用方式大同小异,但需要主意不同的终端类型可能会略有区别。

escape color的格式为:

[{attr};{fg};{bg}m 

其中[是起始字符,在bash中一般是16进制的0×1b,也就是八进制的033,十进制的27,另外一种表现方式就是^[,熟悉吧,在bash中按一下Ctrl+v再按ESC它就出来了。后面分别是attr模式、fg前景色、bg背景色,中间用逗号;间隔,最后用字母m结尾。

attr的取值有:

0   Reset All Attributes (return to normal mode) #重置所有设置,回归自然 1   Bright (Usually turns on BOLD) # 高亮/加粗 2   Dim 3   Underline 5   Blink 7   Reverse 8   Hidden 

fg的取值有:

30  Black 31  Red 32  Green 33  Yellow 34  Blue 35  Magenta 36  Cyan 37  White 

bg的取值有:

40  Black 41  Red 42  Green 43  Yellow 44  Blue 45  Magenta 46  Cyan 47  White 

可以看到,attr/fg/bg的用值范围不重叠,所以空缺哪个无所谓。

在用php输出的时候,只需要在正常字符串内容中,加入适当的escape color代码就可以了,其实其它应用程序也是类似操作的,并不需要额外的设置,比如:

$ php -r 'echo "\x1b[5;31;44m第一种色彩\x1b[3;34;41m第二种色彩\x1b[0m 回归自然\n";' 

看到彩色了吧?秀一下我那个机器人美化之后的界面:

PHP在bash中输出彩色文本

顺便说一句,把字符串储存到文件中的时候,escape color也可以一起存上的,浏览时,cat和tail默认就支持颜色显示,less则需要带上-R参数才行。

Source: http://www.fwolf.com/blog/post/389