在文本模式下显示中文
办公室里我有两台桌面机,一台装的 Windows ,另一台装的 freeBSD 和 Ubuntu 双系统。上班的时候,两台机器我都开着,跑 freeBSD 的时候比较多。
在 freeBSD 下,我很少进 X 。主要是写服务器程序,或者是用来 ssh 到别的服务器上做管理。纯文本模式很清爽,速度很快,让人心情愉快。
唯一的烦恼是,有时候屏幕上有那么几个汉字显示不出来。有时是代码里的中文注释(所以我本人虽然英文极滥,也坚持用英文写注释),有时是别的机器上的一些文件名。
以前有同学向我推荐 zhcon ,类似以前 dos 下的中文系统。可这个玩意性能极低。用它我还不如直接用 X 呢。
周末,我花了两个小时写了个小程序,算是自己的解决方案。
我们知道,VGA 的文本模式,是可以自己换字模的。用 vidcontrol -f 即可。
文本模式可以显示 256 个不同字符,一般用不了那么多。比如 freeBSD 的 syscons 就用了 4 个字符去画鼠标光标。原理就是动态修改字模。有兴趣的同学可以参考 /usr/src/sys/dev/syscons/scvgarndr.c
最简单的办法是用 [128,255] 的 128 个字符临时显示汉字,可以支持 64 个不同的汉字。考虑到鼠标光标占用了 4 个位置。其实是 62 个汉字。
一般也够用了。
我写了几行小程序干这件事情,支持管道操作。从标准输入读入 UTF-8 文本,发现是非 ASCII 集合中的,就临时生成对应的点阵字模(通过 freetype ),把这些字符映射到 [128,255] 之间,输出到标准输出。
以上基本满足我自己的需要。
如果有精力,我希望可以嵌入 syscons 中。比如按下 Scroll Lock 滚屏时,同时检查屏幕上是否有中文,有则做对应转换。在 Scroll Lock 模式下,不必考虑跟 Ascii 冲突的问题,可用的字符是全部 256 个。如果还不够用,可以定时切换字模,并不暂时不可显示的字符做特殊处理(标记为 ? )
再牛 X 一点,可以嵌入一个中文输入法。
或者还有第 2 方案,就是改造 less 。让 less 支持在控制台下显示汉字,如果汉字一次显示不完,暂停就是了。
ps. 莫向我索要代码。只是想应付自己的需要,写的太乱,各种路径也是写死的,不好意思拿出来丢人。需要自己写的,关键技术(更换字模)除了参考 /usr/src/sys/dev/syscons/scvgarndr.c 外,我还参考了: /usr/src/usr.sbin/vidcontrol/vidcontrol.c 。不过几十行程序而已,自己动手,丰衣足食。还是开源系统好啊。:D
另外,如果有同学知道世界上已经存在了上面我说的东西(比如按下 Scroll Lock 就把屏幕上的汉字显示出来),请告之。:D 若是有同学想写一个,我们可以私下交流一下。
Comments
Posted by: 福利工口姬 | (20) April 16, 2014 04:17 PM
Posted by: microcai | (19) December 6, 2010 04:14 AM
Posted by: ruf | (18) July 23, 2009 04:30 PM
Posted by: chu | (17) June 16, 2009 09:58 AM
Posted by: 眼界 | (16) June 12, 2009 07:38 AM
Posted by: sion | (15) June 11, 2009 12:48 PM
Posted by: 小x | (14) May 18, 2009 11:04 PM
Posted by: lifc | (13) May 13, 2009 09:22 AM
Posted by: 赵中 | (12) May 11, 2009 01:24 PM
Posted by: NeutralEvil | (11) May 11, 2009 11:45 AM
Posted by: chu | (10) May 11, 2009 10:12 AM
Posted by: 日程序狂 | (9) May 10, 2009 10:47 PM
Posted by: zelor | (8) May 10, 2009 03:42 PM
Posted by: woolf | (7) May 10, 2009 02:41 AM
Posted by: yegle | (6) May 9, 2009 11:57 PM
Posted by: 羽扬 | (5) May 9, 2009 10:31 PM
Posted by: netawater | (4) May 9, 2009 09:59 PM
Posted by: 程序狂 | (3) May 9, 2009 09:03 PM
Posted by: cocobear | (2) May 9, 2009 08:03 PM
Posted by: 无限 | (1) May 9, 2009 06:56 PM