探讨CJKTTY补丁如何让linux虚拟终端显示汉字的原理

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 命令进行切换。

当前拥有显示器和键盘的虚拟终端被称为活动终端或者当前终端。

时间: 2025-01-03 13:54:28

探讨CJKTTY补丁如何让linux虚拟终端显示汉字的原理的相关文章

如何改造 Linux 虚拟终端显示文字

简介: 本文就 CJKTTY 补丁如何让 linux 虚拟终端显示汉字的原理进行了讨论,为此介绍了 Linux 虚拟终端和其依赖的硬件的工作原理.过程中我们分析了 Linux 字符终端的不足之处,并向读者介绍前沿的 Wayland system compositor 是什么以及为什么 需要它. CJKTTY 补丁是什么,为什么我写了它 当你不使用 X 的时候,打开电脑,你就在使用虚拟终端.这么多年来它工作的很好,直到它来到了中国.包含中文字符的文件名无法正确显示,中文文档无法阅读.当然可以使用

Win7系统更新补丁后黑屏只显示资源管理器的恢复方法

Win7系统更新补丁后黑屏只显示资源管理器的恢复方法   具体方法如下: 1.首先,在确保电脑连接到互联网的情况下重启电脑,然后登陆管理员帐户等到黑屏出现; 2.此时同时按下"Ctrl+Alt+Del"组合键打开Windows任 务管理器窗口; 3.在"应用程序"选项下点击"新任务"按钮; 4.然后输入以下命令:"C:Program FilesInternet Exploreriexplore.exe"即可打开IE浏览器了.这

中文方块-linux中文显示方块问题

问题描述 linux中文显示方块问题 平台:CentOS 6.4用basic server的方式安装,在tty1的环境下使用,把语系改为zh_CN.UTF-8后,所有中文的地方都显示为方块.网上说是中文字体的问题,尝试了好久都没成功,快崩溃了,小弟刚学linux才1个月,没什么经验,求大牛们指导. 解决方案 server上要安装中文字体文件.

linux验证码-验证码在linux下显示红叉

问题描述 验证码在linux下显示红叉 验证码在windows下能正常显示,在linux下显示红叉,验证码用的是kaptcha2.3.2.jar,请问怎样才能让在linux环境下正常显示,谢谢! 解决方案 http://blog.csdn.net/baohuan_love/article/details/14226285 这里有篇文章你可以参考下,希望对你有所帮助!

01_Linux系统系统语言查询,设置Xshell工具,中文显示,测试Xshell中文字符显示,Linux中文显示乱码设置

          Xshell是一个强大的安全终端模拟软件,它支持SSH1,SSH2,以及Microsoft Windows平台的TELNETNetSarang Xshell 4 Build 0120议.使用Xshell可以快速方便的管理Linux主机等     但是有时我们使用,经常遇到.linux下中文显示乱码的情况,其实解决办法很简单,下面跟着小编来看看,如何解决XShell连接linux中文乱码 工具/原料     Linux系统(Centos)  Xshell Xshell连接L

[20140627]linux下显示那个进程使用swap

[20140627]linux下显示那个进程使用swap.txt --要了解linux下那个进程使用交换: for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less for file in /proc/*/status do     awk '/VmSwap|Name/{printf

使用Tslib在触摸屏上显示汉字【转】

转自:http://www.latelee.org/embedded-linux/use-tslib-to-display-chinese-character.html 终于到了在触摸屏上显示汉字了,真正写代码.测试的时间是1天,在此之前的一切准备.学习花费约2周到3周时间.而为了获取触摸屏上显示的图像,花费约2天.由于网络驱动已经接近于放弃状态,NFS用不了,只好用U盘来回复制(即使没有耐心也必须有耐心了).明明在内核中选择了支持NTFS格式的读写,但却不能将开发板上的文件复制到U盘,而用另一

FVWM上显示汉字的心得

汉字|显示|心得 按照网上的各种心得,始终不能显示汉字. 然后,研究了FVWM中script的写法,再研究了 FONT的定义,得到方法如下: 1.找到你的机子上的汉字名称,使用以下命令: xlsfonts |grep 2312 列出了一堆名称 2.只能选择其中的16或24点阵字体,不要选择 truetype,  因为我选择过 truetype 不行,选择 GBK 或 GB18030 编码的也不行.  这点是最重要的. 3.然后修改 ~/.fvwm/.fvwm2rc ,加入: MenuStyle

在PHP的图形函数中显示汉字

函数|汉字|图形|显示 如何在PHP图形函数中显示汉字,大家已经问了很久了,但一直没有结果.终于在参考另一篇文章后,我试验出来了! 方法: 首先,决定要显示哪些汉字,如"计数器"这三个字. 到Word2000(97不知可不可以)中去,输入这三个字,另存为,选择编码格式,然后再在右边的编码类型里选择unicode utf-8,记住不要选错了.存成一个编码格式的文本文件,比如说文件名叫test.txt. 用一个16进制的编辑器打开这个文件,这时你会看到,里面有一堆16进制字符,一个汉字占三