[原创]用vt让FreeBSD终端显示汉字_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4667 | 回复: 0   主题: [原创]用vt让FreeBSD终端显示汉字        下一篇 
wulcan
版主
等级:中校
经验:1795
发帖:124
精华:0
注册:2014-3-19
状态:离线
发送短消息息给wulcan 加好友    发送短消息息给wulcan 发消息
发表于: IP:您无权察看 2015-5-20 17:45:49 | [全部帖] [楼主帖] 楼主

在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也在进步。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论