lsstarboy 发表于 2015-05-20 17:50

用vt让FreeBSD终端显示汉字

本帖最后由 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_MAXMAPPINGS8192                #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里加入下面一行:font8x16="aa"注意引号里面的字符对应于字体文件的名字,如果你使用了其他文件名,请修改这个地方。

重新启动,会在启动信息里找到下面一句: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

lsstarboy 发表于 2015-05-20 17:51

lsstarboy 发表于 2015-05-20 17:51

蛮多肉 发表于 2015-05-20 18:12

支持楼主
:em03:

getsmartboy 发表于 2015-05-20 20:17

Well done!

chillyrains 发表于 2015-05-21 12:46

有个疑惑:显示中文没问题了,vt下如何输入中文呢?

以前用过zhcon,是自带中文输入法的。

lsstarboy 发表于 2015-05-21 14:11

回复 6# chillyrains


没有汉字输入的需求,没研究过。
要输入汉字,或者进X,或者远程,终端本身就是一个临时性的操作台,连zhcon也已经10年没动静了。

chillyrains 发表于 2015-05-22 12:42

回复 7# lsstarboy

感谢答复!

能显示中文也是很大的进步了。和直接使用终端相比,使用Windows或X远程登录的体验好多了。


   

foxwb 发表于 2015-05-26 22:28

顶一下:em03:

zero-B 发表于 2015-10-02 00:22

呃。。。大家都在浪漫的时候LZ却在码字。。。辛苦。。辛苦。。我就想问一个问题,使用了VT之后能在 CLI 显示汉字了,那文字编辑器里呢?有没有试过?如果这个问题也解决了,那使用FB的障碍可是少了一大堆啊。
页: [1] 2 3 4
查看完整版本: 用vt让FreeBSD终端显示汉字