在FreeBSD下显示汉字一直是我们Fber的梦想,原来要加一大堆的东西才能显示,自从10.1以后,多了个vt驱动,终于可以在终端下玩汉字了,虽然步骤不是很简单,色彩不是很丰富,但至少多了一种可能。
先来看几个条件:首先需要在内核中编译vt,顺便把vt_vga也要带上,否则显示可能不那么顺利;其次,需要一个字体,没有字体只能显示\0xfa\0xfa这之类的符号;最后,还需要配置一下,让vt跟字体挂上钩。
我们一步一步来做。
1、编译内核:
在内核文件中加入下面四行:
options TERMINAL_NORM_ATTR=(FG_GREEN|BG_BLACK)
options TERMINAL_KERN_ATTR=(FG_LIGHTCYAN|BG_BLACK)
device vt
device vt_vga
同时注释掉下面三行:
#device sc
#options SC_PIXEL_MODE # add support for the raster text mode
#device vga # VGA video card driver
解释一下:
加上的大写字母的那两行,表示vt的背景色和前景色,前一行是正常的输出,采取的颜色方案是:黑色背景,绿色前景(黑客帝国的经典配色方案哦!),后一行是内核的输出,淡青色前景,黑色背景。具体的颜色取值在本文后方查找。
去掉的三行,前两行是sc的,老式的syscons,这个和vt是互斥的,只能选一个,vga和vt_vga也是互斥的,vga其实会自动禁掉。
重新编译内核,重启,你会发现已经有变色的屏幕了。
但是再还有一个重要的步骤:修改源代码,否则虽然你可以显示彩色,但是不能显示汉字!修改的文件是/usr/src/sys/dev/vt/vt_font.c:
左边是源代码,后面是修改的值:
44 #define VTFONT_MAXMAPPINGS 8192 #define VTFONT_MAXMAPPINGS 65536
45 #define VTFONT_MAXGLYPHSIZE 1048576 #define VTFONT_MAXGLYPHSIZE 2097152
46 #define VTFONT_MAXDIMENSION 128 #define VTFONT_MAXDIMENSION 128
原因是默认值太小,装不下字体文件,要改大一些才能装下这上万个字的字体。该值在新版中好像已经纠正了。
如果没彩色,那么请检查一下/boot/loader.conf,在里面加上下面两行试试,在大多数情况下,已经是默认的了:
hw.vga.textmode=0
kern.vty=vt
2、转换vt支持的字体
vt使用的字体是fnt,在/usr/share/vt/fonts目录下,这个目录下已经有部分字体,但仅限英文、俄文等少数语言,要使用CJK,也就是中韩日文,就必须自己做字体。但是vt又不能使用windows下的ttf字体,并且目前也没有找到转换程序,这使得做字体非常麻烦。
好在开源界大有热心人士:http://www.unifoundry.com/unifont.html给我们提供了一系列的中文字体,这个unifont是基本文泉驿字体做的,虽然仅支持几千个汉字,但是可以应付一般的应用了,连“镕”字都有。在这个页面上,下载hex的版本,虽然有人推荐bdf的版本,但是经过我测试,转换不成功,只有hex的版本才能转换成功。
把下载下来的gz文件解压,然后用系统自带的vtfontcvt转换:
# gunzip unifont_sample-7.0.06.hex.gz
# vtfontcvt unifont_sample-7.0.06.hex aa.fnt
这样便得到了一个aa.fnt,这个便是我们需要的字体文件了。
3、告诉系统使用中文字体:
要使用aa.fnt,就必须先把它复制到vt的字体目录里:
cp aa.fnt /usr/share/vt/fonts/
然后还要用rc.conf,告诉系统在启动时加载中文字体,在rc.conf里加入下面一行:
font8x16="aa"
注意引号里面的字符对应于字体文件的名字,如果你使用了其他文件名,请修改这个地方。
重新启动,会在启动信息里找到下面一句:
Configuring vt: font8x16 blanktime.
这时系统已经具备显示汉字的能力了,但是还没有显示。
4、显示汉字:
先做个提示:由于unifont只识别utf-8的编码,所以只能显示utf-8编码的汉字,其他编码不可以。
我们先做个直接显示,先在windows上用utltredit32做一个文件,rc.local,内容为一串汉字,保存时使用“无BOM的utf-8”,然后使用winscp传到/etc/目录下,再重新启动,你就会发现奇迹了。
结束语:
vt给我们一个惊喜,虽然在二十年前,DOS终端就可以显示汉字,但这不能说明FreeBSD落后,vt的出现,也告诉人们,FreeBSD也在进步。