« 回顾 Forth | 返回首页 | 树结构的管理 »

在文本模式下显示中文

办公室里我有两台桌面机,一台装的 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

不是做这行的。

呵呵,挖坟,我给 Linux 也实现了一个控制台汉字补丁。呃。大神嘛时候将就着用一下

嗯,如果你不是因为机器太慢而拒绝X的话~~尝试一下X+dwm吧,很好用。

眼界兄所言极是

to 程序狂
老兄眼光有点低。我虽然不是做游戏的,但是有一个很明显的直觉,云风的技术不过是中上之资。

他能有今天,很多都是环境、性格因素、运气使然。如果你以他为目标,说不准还赶不上他。即便技术达到了,地位上也绝对达不到。

关于水平的问题实际上我只是希望不那么客套虚伪。国内从理论到技术再到应用,大体是个什么样子大家心里都清楚。

我觉得反而大家不清楚的就是更高的水平其实也是普通人,随着大环境的改善,我们也能逐渐达得到。

其实愿意以做技术目标,是一件好事。但是希望比我们更年轻的一代人,不要以人,甚至不要以世界范围内顶尖的人为目标。

我们要以我们从事的领域为目标。最初是学习,不会的我们要去会;接下来更多的,应该以创新为目标:有什么问题是整个行业上都没解决的、最前沿的。

也许有朋友会说,那没戏,云风都没戏,小崽子有什么戏。我不这么认识这件事。并非说你已经全面超越了比如Carmack(虽然他老了)你才能够创新;而是说对于你感兴趣的、想解决的那件事,你积累了足够的知识就可以。

如果不是如此,人类就永远无法进步:每个年轻人的时间都是有限的,即便一个很小的领域,你也无法在每个方面上都超过别人,真正要做的应该是有你真正擅长的那一小块。

实际上我认为在这一点上,云风也做得很不够。

我年纪可能比云风还小,混得也不如意,绝对没有指点谁的意思。拿出来让大家看看。

TO程序狂:
有上进心是好事,不过要适度,2个月可能连皮毛都没搞明白呢,再说你的生活环境和云风的已经不一样了,他有的很多阅历你都没有,多了解一下吧

可以看出,云风是用32位FreeBSD的

我觉得FreeBSD 32位都支持 VESA 模式,在上面弄一个显示汉字的系统对云风不难吧?

改字模太难看了吧?

我觉得字符界面的BSD,设置为1024加上可以显示汉字一定很舒服,对于用Unix的人来说。

要解决汉字中间裂痕,可以把左边字模映射到表格符区域,显卡对这部分字模会自动重复最后一列点阵,填满两个字符之间的裂痕。
和7楼提出的方法相比,这样的好处是不必改变全局字符属性,缺点是能同屏无裂痕显示的汉字数量少了很多。

用老掉牙的汉卡是不是更爽?

Putty还是不错的,特别是对像我这种工作没办法脱离Windows的可怜人。中文输入用vimim,(maxiangjiang.googlepages.com/vimim.html),直接在VIM里面输中文,不需要其他环境。

我比较懒,所以用现成的 putty 解决文本模式下的中文问题^^

to 程序狂 :
说这句话的你就是带着攀比与功利去搞程序,这样的人大牌得死。这种心态肯定后在膨胀后得到一次沉重的教训才知道啥叫做低调!!!

在win下putty算不算?

显示和输入都比较容易。

十几年前用 DOS 时实现过类似的东西。印象中把一个中文拆成两个英文字模很难完美。因为每个英文字符实际占用 9*16 个像素, 但字模只能只能定义 8*16 个像素。还有一个开关可以控制是否把第8列复制到第9列。不打开这个开关的话每个汉字中间会有一列空白,打开的话因为复制第八列又会感觉汉字显示很臃肿。 以上仅凭记忆复述 93,94 年大脑里的一些残余,懒得搜索验证了, hehe。

fbterm/jfbterm + ucimf
应该能在freebsd上搞定吧?
我显卡现在抽风,偶尔才回光返照,用fbterm+ucimf好久了……支持ttf字体……

3楼的程序狂真是挺狂的啊,哈哈哈

试试cce2k或者unicon.

zhcon的性能真的这么差吗?

您好,云风,我入游戏这一行已经2个月了,我正在变得越来越强大,5年之后我一定会超越你。

我也是经常会有这种需要,也试过用zhcon了,太不稳定了。

只是这种解决方案还是很不方便,ls后还得重定向才能看到正确的汉字。

要是直接嵌入到终端里面确实比较好。

Linux下是不可以以同样的方式实现呢?有时间俺也折腾折腾。

既然你也知道开源好 也在享用开源
还是把代码放一放吧 放心 不会不加修改就去运行

Post a comment

非这个主题相关的留言请到:留言本