在文本模式下显示中文
办公室里我有两台桌面机,一台装的 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
呵呵,挖坟,我给 Linux 也实现了一个控制台汉字补丁。呃。大神嘛时候将就着用一下
Posted by: microcai | (19) December 6, 2010 04:14 AM
嗯,如果你不是因为机器太慢而拒绝X的话~~尝试一下X+dwm吧,很好用。
Posted by: ruf | (18) July 23, 2009 04:30 PM
眼界兄所言极是
Posted by: chu | (17) June 16, 2009 09:58 AM
to 程序狂
老兄眼光有点低。我虽然不是做游戏的,但是有一个很明显的直觉,云风的技术不过是中上之资。
他能有今天,很多都是环境、性格因素、运气使然。如果你以他为目标,说不准还赶不上他。即便技术达到了,地位上也绝对达不到。
关于水平的问题实际上我只是希望不那么客套虚伪。国内从理论到技术再到应用,大体是个什么样子大家心里都清楚。
我觉得反而大家不清楚的就是更高的水平其实也是普通人,随着大环境的改善,我们也能逐渐达得到。
其实愿意以做技术目标,是一件好事。但是希望比我们更年轻的一代人,不要以人,甚至不要以世界范围内顶尖的人为目标。
我们要以我们从事的领域为目标。最初是学习,不会的我们要去会;接下来更多的,应该以创新为目标:有什么问题是整个行业上都没解决的、最前沿的。
也许有朋友会说,那没戏,云风都没戏,小崽子有什么戏。我不这么认识这件事。并非说你已经全面超越了比如Carmack(虽然他老了)你才能够创新;而是说对于你感兴趣的、想解决的那件事,你积累了足够的知识就可以。
如果不是如此,人类就永远无法进步:每个年轻人的时间都是有限的,即便一个很小的领域,你也无法在每个方面上都超过别人,真正要做的应该是有你真正擅长的那一小块。
实际上我认为在这一点上,云风也做得很不够。
我年纪可能比云风还小,混得也不如意,绝对没有指点谁的意思。拿出来让大家看看。
Posted by: 眼界 | (16) June 12, 2009 07:38 AM
TO程序狂:
有上进心是好事,不过要适度,2个月可能连皮毛都没搞明白呢,再说你的生活环境和云风的已经不一样了,他有的很多阅历你都没有,多了解一下吧
Posted by: sion | (15) June 11, 2009 12:48 PM
可以看出,云风是用32位FreeBSD的
我觉得FreeBSD 32位都支持 VESA 模式,在上面弄一个显示汉字的系统对云风不难吧?
改字模太难看了吧?
我觉得字符界面的BSD,设置为1024加上可以显示汉字一定很舒服,对于用Unix的人来说。
Posted by: 小x | (14) May 18, 2009 11:04 PM
要解决汉字中间裂痕,可以把左边字模映射到表格符区域,显卡对这部分字模会自动重复最后一列点阵,填满两个字符之间的裂痕。
和7楼提出的方法相比,这样的好处是不必改变全局字符属性,缺点是能同屏无裂痕显示的汉字数量少了很多。
Posted by: lifc | (13) May 13, 2009 09:22 AM
用老掉牙的汉卡是不是更爽?
Posted by: 赵中 | (12) May 11, 2009 01:24 PM
Putty还是不错的,特别是对像我这种工作没办法脱离Windows的可怜人。中文输入用vimim,(maxiangjiang.googlepages.com/vimim.html),直接在VIM里面输中文,不需要其他环境。
Posted by: NeutralEvil | (11) May 11, 2009 11:45 AM
我比较懒,所以用现成的 putty 解决文本模式下的中文问题^^
Posted by: chu | (10) May 11, 2009 10:12 AM
to 程序狂 :
说这句话的你就是带着攀比与功利去搞程序,这样的人大牌得死。这种心态肯定后在膨胀后得到一次沉重的教训才知道啥叫做低调!!!
Posted by: 日程序狂 | (9) May 10, 2009 10:47 PM
在win下putty算不算?
显示和输入都比较容易。
Posted by: zelor | (8) May 10, 2009 03:42 PM
十几年前用 DOS 时实现过类似的东西。印象中把一个中文拆成两个英文字模很难完美。因为每个英文字符实际占用 9*16 个像素, 但字模只能只能定义 8*16 个像素。还有一个开关可以控制是否把第8列复制到第9列。不打开这个开关的话每个汉字中间会有一列空白,打开的话因为复制第八列又会感觉汉字显示很臃肿。 以上仅凭记忆复述 93,94 年大脑里的一些残余,懒得搜索验证了, hehe。
Posted by: woolf | (7) May 10, 2009 02:41 AM
fbterm/jfbterm + ucimf
应该能在freebsd上搞定吧?
我显卡现在抽风,偶尔才回光返照,用fbterm+ucimf好久了……支持ttf字体……
Posted by: yegle | (6) May 9, 2009 11:57 PM
3楼的程序狂真是挺狂的啊,哈哈哈
Posted by: 羽扬 | (5) May 9, 2009 10:31 PM
试试cce2k或者unicon.
zhcon的性能真的这么差吗?
Posted by: netawater | (4) May 9, 2009 09:59 PM
您好,云风,我入游戏这一行已经2个月了,我正在变得越来越强大,5年之后我一定会超越你。
Posted by: 程序狂 | (3) May 9, 2009 09:03 PM
我也是经常会有这种需要,也试过用zhcon了,太不稳定了。
只是这种解决方案还是很不方便,ls后还得重定向才能看到正确的汉字。
要是直接嵌入到终端里面确实比较好。
Linux下是不可以以同样的方式实现呢?有时间俺也折腾折腾。
Posted by: cocobear | (2) May 9, 2009 08:03 PM
既然你也知道开源好 也在享用开源
还是把代码放一放吧 放心 不会不加修改就去运行
Posted by: 无限 | (1) May 9, 2009 06:56 PM