颜色控制符
现象
Telnet发送ls指令收到的目录名(此目录名为2.1,用粗体标出):
<ESC>[00m<ESC>[01;34m 2.1 <ESC>[00m
对应的原始字节流是(16进制):
1b 5b 30 30 6d 1b 5b 30 31 3b 33 34 6d 32 2e 31 1b 5b 30 30 6d
解释
这些正文前后奇怪的字符序列是 ANSI escape sequence , 也就是为了在 字符终端 (俗语所云的“命令行窗口”)上显示控制格式、字体颜色等东西, 由 ANSI 制定的,服务器发送给 终端 的字符序列定义,例如下图中为了区别文件和目录, 服务器将文件名的颜色设为白色,而将目录名(Desktop)设为蓝色,
终端收到原始报文
anaconda-ks.cfg<SPACE><SPACE><ESC>[00m<ESC>[01;34mDesktop<ESC>[00m<SPACE><SPACE>install.log
后,按照ANSI标准解释其中的转义序列,再形成我们看到的不同颜色。这个标准中关于字体颜色定义部分叫做SGR( Select Graphic Rendition ),格式是:
CSI code_num m
其中CSI( Control Sequence Introducer ,这里是
anaconda-ks.cfg <颜色初始化><亮色、蓝色>Desktop<颜色初始化> install.log
下面是一个 ls -l
命令的结果截图和对应的原始ASCII码,其中字体颜色有:
蓝色(30+4),红色(30+1),绿色(30+2)以及绿色背景(40+2);
drwxr-xr-x 2 godu boco 4096 2011-04-15 <ESC>[01;34maaa111<ESC>[00m
drwxr-xr-x 4 godu boco 4096 2011-03-03 <ESC>[01;34maatest<ESC>[00m
-rw-r--r-- 1 godu boco 4899 2011-06-14 <ESC>[00mcrc32.c<ESC>[00m
-rw-r--r-- 1 godu boco 579 2011-06-14 <ESC>[00mcrc32 oracle.txt<ESC>[00m
drwxr-xr-x 4 godu boco 4096 2011-05-11 <ESC>[01;34mGoduDb_test<ESC>[00m
-rw------- 1 godu boco 2836280 2011-05-11 <ESC>[01;31mGoduDb_test.zip<ESC>[00m
drwxr-xr-x 7 godu boco 4096 2011-04-28 <ESC>[01;34mGODU-platform<ESC>[00m
drwxr-xr-x 7 godu boco 4096 2010-12-20 <ESC>[01;34mGODU-platform_bak5-6<ESC>[00m
-rw-r--r-- 1 godu boco 56420261 2011-05-06 <ESC>[01;31mGODU-platform-V2.1_P2_20110506.tar.gz<ESC>[00m
-rwxr-xr-x 1 godu boco 7652 2011-06-14 <ESC>[01;32mlibcrc32.so<ESC>[00m
drwxr-xr-x 60 godu boco 4096 2011-05-06 <ESC>[01;34mterracotta<ESC>[00m
drwxrwxrwx 13 godu boco 4096 2011-02-16 <ESC>[34;42mterracotta-2.7.2<ESC>[00m
-rw-r--r-- 1 godu boco 58982400 2011-02-16 <ESC>[01;31mterracotta-2.7.2.tar<ESC>[00m
-rw-r--r-- 1 godu boco 49970439 2011-02-16 <ESC>[01;31mterracotta-2.7.2.tar.gz<ESC>[00m
光标定位和擦除屏幕
屏幕绘制方面的主要有“指定光标位置”(CSI n;m H)和“擦除显示”两类,
后者包括“擦除屏幕”(CSI n J)和“擦除行”(CSI n K)两小类,
参数用法见 wiki对CSI Codes的说明 ,其中“擦除行”被用于用户输入退格键(Backspace)的处理,
当用户(client)向server发送退格键(0x08)时,server返回的是"08 1b 5b 4b",
也就是"Backspace
下面是一个mina server的handler的sessionOpened方法,使用了CSI5;5H和CSI2J,客户端连入这个server的效果如下图:
@Override
public void sessionOpened(IoSession session) {
byte[] aes = { 0x1b, 0x5b, 0x35, 0x3b, 0x35, 0x48, 0x1b, 0x5b, 0x32,
0x4a, 0x1b, 0x5b, 0x30, 0x30, 0x6d, 0x1b, 0x5b, 0x33, 0x34,
0x3b, 0x34, 0x32, 0x6d, 0x32, 0x2e, 0x31, 0x1b, 0x5b, 0x30,
0x30, 0x6d };
String aesStr = new String(aes);
session.write(aesStr);
System.out.println(aesStr);
}
<ESC>(B
: Set to US ASCII character set(see " VT100 ESC sequences "for detail);
设置窗口标题(Set Window Title)
用putty登录10.0.2.47的23端口,收到的原始报文如下(用Wireshark抓包):
\033]0;godu@goduserver:~\007[godu@goduserver ~]$
可以看到登录成功后窗体标题变了,原因就是上面的“\033]0;...\007”造成的;
切换屏幕
\033[?1049h
和\033[?1049l
分别是切换到新屏幕和切换回来,演示程序见笔记 演示切换屏幕控制序列的程序 。
参考:
光标显示/隐藏
\033[?25h
和\033[?25l
分别是显示和隐藏光标;
模式
Normal和Application模式的区别见 Cursor key mode.