- 论坛徽章:
- 54
|
本帖最后由 lsstarboy 于 2015-05-20 17:55 编辑
在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
复制代码 原因是默认值太小,装不下字体文件,要改大一些才能装下这上万个字的字体。该值在新版中好像已经纠正了。
(CU正文没有flash不能上传图片,请见二楼)
如果没彩色,那么请检查一下/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里加入下面一行:注意引号里面的字符对应于字体文件的名字,如果你使用了其他文件名,请修改这个地方。
重新启动,会在启动信息里找到下面一句:- Configuring vt: font8x16 blanktime.
复制代码 这时系统已经具备显示汉字的能力了,但是还没有显示。
4、显示汉字:
先做个提示:由于unifont只识别utf-8的编码,所以只能显示utf-8编码的汉字,其他编码不可以。
我们先做个直接显示,先在windows上用utltredit32做一个文件,rc.local,内容为一串汉字,保存时使用“无BOM的utf-8”,然后使用winscp传到/etc/目录下,再重新启动,你就会发现奇迹了。
(CU正文没有flash不能上传图片,请见三楼)
结束语:
vt给我们一个惊喜,虽然在二十年前,DOS终端就可以显示汉字,但这不能说明FreeBSD落后,vt的出现,也告诉人们,FreeBSD也在进步。
附:颜色值的定义:- sys/i386/include/pc/display.h)
- /* Color attributes for foreground text */
- #define FG_BLACK 0
- #define FG_BLUE 1
- #define FG_GREEN 2
- #define FG_CYAN 3
- #define FG_RED 4
- #define FG_MAGENTA 5
- #define FG_BROWN 6
- #define FG_LIGHTGREY 7
- #define FG_DARKGREY 8
- #define FG_LIGHTBLUE 9
- #define FG_LIGHTGREEN 10
- #define FG_LIGHTCYAN 11
- #define FG_LIGHTRED 12
- #define FG_LIGHTMAGENTA 13
- #define FG_YELLOW 14
- #define FG_WHITE 15
- #define FG_BLINK 0x80
- /* Color attributes for text background */
- #define BG_BLACK 0x00
- #define BG_BLUE 0x10
- #define BG_GREEN 0x20
- #define BG_CYAN 0x30
- #define BG_RED 0x40
- #define BG_MAGENTA 0x50
- #define BG_BROWN 0x60
- #define BG_LIGHTGREY 0x70
复制代码 另发于:http://bbs.landingbj.com/t-0-256758-1.html |
|