CJKTTY 补丁是什么,为什么我写了它
当你不使用 X 的时候,打开电脑,你就在使用虚拟终端。这么多年来它工作的很好,直到它来到了中国。包含中文字符的文件名无法正确显示,中文文档无法阅读。当然可以使用 X , 但是我为什么不能让终端也能显示汉字呢?如果在 X 下我能让">屏幕显示汉字,终端下一定也能。为此我开始了 internet 上的搜寻。我找到了 fbterm,这是个可以利用 /dev/fb0 实现的终端模拟器,和 XTERM 一样,只不过 XTERM 利用的 X 绘制文字,而 fbterm 直接写入 /dev/fb0。
然而我似乎总是忘记登录后开启 fbterm,对我来说,等看到乱码的时候突然想起没有开启 fbterm 并不是那么愉快的经历。这只是其中一个缺点。fbterm 占用了帧缓冲区设备,导致 w3m 这类使用帧缓存绘制图像的终端 www 浏览器不能正常工作。许多依赖帧缓冲区设备的终端程序都不能被 fbterm 良好的兼容。于是我继续寻找,找到了 youbest 写的中文补丁。我有个喜欢使用最新内核的习惯,当内核升级导致 youbest 的补丁再也不能使用的时候,我开始到 youbest 发布补丁的页面留言,希望 youbest 百忙中能修改一下他的补丁。
Youbest 似乎很忙,在新内核的诱惑下,我决定自己在修改。那个时候我才真正的开始看内核的代码。终于了解了虚拟终端的工作原理后,我开始修改内核。由于内核内部结构变动导致 youbest 的补丁无法应用,我几乎是从头开始了开发而不是简单的将无法应用的部分进行修整。唯一得到保留的就是 youbest 补丁中的点阵字库。我将其命名为 CJKTTY , 取能显示 CJK 的 TTY 之意。
从那里获得中文显示补丁呢?
我将补丁托管在了 http://repo.or.cz/w/linux-2.6/cjktty.git,依据你使用的内核版本,签出内核版本 -utf8 分支就可以。
控制台是如何显示文字呢?
那么,为了能在控制台下显示出汉字到底需要做什么样的修改么?在开始前,我想先介绍一些名字,并介绍一些控制台在硬件上是如何进行文字显示的。首先我解释一下几个名词,知道的人可以到这里开始阅读。
UNICODE
为每一个字符分配全球唯一的一个数字,但是并没有规定这个数字的表示方法。数字的表示方法由 UTF 规范规定。UTF-16 使用 2 个字节表示一个 UNICODE 数字,但是对于 >=216的数字使用 4 字节来表达。UTF-8 则对于 <127 的数字采取单字节表示,大于 127 的数字要根据其大小选择 2~6 个字节进行表示。UNICODE 在程序内部则简单的使用 unsigned long 即可表示一个字符。
GLYPH
GLYPH 指的是字体里的字形。字符总是要在特定的字体下表示的,该表示就是字形。比如一个只包含 26 个大小写字母的字体,只包含了 52 个字形,如果该字体是先大写后小写排列的,那么数字 0 就表示字形 'A' , 数字 1 就表示字形 'B'。UNICODE 或者 ASCII 到 GLYPH 的映射是由一个称作 CMAP 的映射表做的。如果字体里字符就是按照 UNICODE 排列的,则其 CMAP 就是 UNICODE CMAP。同理也有 ASCII CMAP。 VGA 自带字体没有提供 CMAP,操作系统假定它的 CMAP 是 ASCII CMAP。事实上也是如此。
TTY
内核为终端提供的接口,对应用程序而言就是 TTY 设备。通常是使用 stdin stdout 来访问。TTY 提供各种 IOCTL 用来设置终端的模式。TTY 也提供了用户控制程序的方法,比如 Ctrl-C 终止当前程序。 TTY 可以是显示器 + 键盘构成的控制台,也可以是串口(可以通过猫链接到电话线上),可以通过 pts 模拟。XTERM 即利用 pts 为里面运行的程序提供的模拟的终端 , 对应的设备文件 /dev/pts/* 由模拟终端程序动态创建。
控制台 (CONSOLE)
控制台特指由显示器 + 键盘构成的终端。其中显示器由显卡控制,而且当前 VGA 兼容显卡有两种模式,文字模式和图形模式。Linux 即可以使用文字模式也可以使用图形模式。
控制台对于程序是无法访问的,程序只能通过虚拟终端使用控制台
虚拟终端 (VT)
如果你的电脑只有一个终端,那将是多么乏味。一个需要长时间执行的任务就能导致你什么也做不了,Linux 的多任务机制的好处荡然无存。所以,你需要更多的终端。Linux 内核使用复用机制,将一个控制台复用为多个终端 (63 个,/dev/tty1 到 dev/tty63)。按键 Alt+F1-F12 ( 如果当前在 X 中,需要再按下 Ctrl 键 ) 能在 12 个终端中进行切换。事实上你拥有 63 个终端,键盘只能切换其中的 12 个,其他的终端你可以通过 chvt 命令进行切换。
当前拥有显示器和键盘的虚拟终端被称为活动终端或者当前终端。