在Linux终端机上显示中文,可是个老大难问题。
最开始,比尔盖子根本就没意识到这个问题的严重性。Fedora在这个问题上可谓是相当有人性化关怀:使用同一账户登陆系统,在桌面环境中,Fedora会采用你所设置的语言显示文字;在GUI下的终端模拟器,也会采用用户自己设置的语言;而到了tty下,则会自动切换为英文显示。可见开发者在这个问题上用心良苦。后来,比尔盖子便尝试了Ubuntu。当我将终端从tty7切换到tty1并登录后,震惊我的不是Ubuntu那套“只有横没有竖”的字体,而是apt-get中的乱码。看来,Ubuntu这次深刻的告诉我了一个道理:中文是方块字。
也倒不是说看不懂英文,英文对于我们来说,毫无压力。而是你总不可能永远用Fedora。而不用Fedora,就会有问题:使用中文桌面,自然而然的,会设置LANG=zh_CN.utf8的环境变量。但是一旦到了tty下,中文立马变成方块字了。如果使用英文Locate吧,在GUI下有得不到中文显示。如果使用英文Locate,再手动将GUI的语言改成中文,可能在GUI的终端模拟器上,又得不到中文。好在现在的Gnome等环境,已经先进到足以规避此类问题的程度,可以做的和Fedora一样。但仍旧有一个问题挥之不去——就算是Fedora,在GUI崩溃之时,明明很多有用的文件就在系统中,只因是方块字从而和没有一样。
还好,如今有了Framebuffer之后,什么东西都能往终端机上放——视频,图片。当然,还有中文。fbterm就是一个相当不错的环境。然而,在fbterm没有加载之前,你还是不得不接受中文就是方块字的事实。无意中,比尔盖子发现了这个《内核补丁:字符终端下显示UTF-8字符》。然而,当我满心欢喜的点击链接时:该网站未备案已被关闭。于是便发邮件与作者沟通,结果毫无音讯。看到作者的博客已经很长时间未更新了,真不知是否被请去喝茶了?
昨天,突然看到此文下面的一条评论,大意是:
我修改了第一版文字显示补丁,现在可以用在3.3内核上。同时修改了第一版字库补丁,用了Unifont字体,该字体涵盖了Unicode标准中的所有可打印字符。在Archlinux x86_64下测试通过,测试的内核版本是linux-3.3.5-1和linux-3.3.6-1。
Archlinux PKGBUILD文件:
https://bit.ly/archlinux-PKGBUILD (box.net)
https://bit.ly/PKGBUILD-archlinux (Dropbox)
果然是极好的消息,现在终于有可用的补丁了。于是去Dropbox上下载到补丁。打上补丁之后,中文方块字依旧。后来去笔记本上试验,还遇到了新内核导致系统X11——Framebuffer——udev——所有模块失效的问题,最终发现只是modules.dep坏了。
废话已经说的太多了,现在终于可以进入正题了。
修改与配置内核
我假设你已经有过编译内核的经验,也知道如何根据自己的情况配置内核。
本补丁仅仅对UTF-8编码生效,不支持GBK, Big5等地方性编码。
在进行以下操作之前,请注意您终端的分辨率,至少是1024×768,即vga=791/792。如果不是,就会由于终端分辨率太低而无法加载中文字体。这意味着使用Nvidia闭源显卡驱动的人可能先要折腾一轮终端机分辨率的问题了。在您折腾完Framebuffer的分辨率后,就可以往下看了。
下载补丁
补丁的原作者是Youbest,我从呢楠私语这里获得了补丁文件,并且自己修改并编译。不过,我发现了Havanna修改好的patch,也就不用费神自己制作了。
补丁可以从这个文件夹下载到:http://biergaizi.info/files/linux/kernel/.
使用Gentoo系统,并且使用gentoo-source-3.4.2及以上版本的的用户需要下载utf8-kernel-fonts-3.patch.tar.xz和gentoo-sources-utf8-core-1.patch;使用其它系统,或者你不知道Gentoo是什么,你需要下载utf8-kernel-2.6-fonts-3.patch.tar.xz和utf8-kernel-core-1.patch。
应用补丁
比尔盖子假设你,正处在有内核源代码的目录,比如/usr/src/linux。并且,适合于你的两个文件也放在这里。那么,请(以root)执行以下命令。
对于gentoo-soucres-3.4.2以上版本内核的用户
patch -p1 < gentoo-sources-utf8-core-1.patch
xz -d utf8-kernel-fonts-3.patch.tar.xz
patch -p1 < utf8-kernel-2.6-fonts-3.patch
对于主线内核与gentoo-soucres-3.4.2以下版本内核的用户
patch -p1 < utf8-kernel-core-1.patch
xz -d utf8-kernel-fonts-3.patch.tar.xz
patch -p1 < utf8-kernel-2.6-fonts-3.patch
为什么要把它们分开?好让两派用户看着舒服点。
配置内核
我在本章开始处已有提醒,我假设你已经有了一个能够完美工作的Framebuffer。
你需要开启以下内核选项:
Device Drivers --->
Graphics support --->
Console display driver support --->
[*] Select compiled-in fonts
[*] VGA 8x16 font (NEW)
编译内核
这可能对于你来说是废话。
make -j3
mount /boot 2> /dev/null
make modules_install install
# 对于 Grub Legacy,请修改您的内核配置文件,指向新内核
vim /boot/grub/menu.lst
# 对于 Grub2,请重新生成一份内核配置文件
grub-mkconfig -o /boot/grub/grub.cfg
# 对于Funtoo,事情变的简单多了,前提是你的配置允许你偷懒,比如使用通配符
boot-update
检查与使用新内核
reboot
现在开机,看看终端机的中文是否正常吧。
如果正常,你可以考虑在rc.conf设置zh_CN.uft8或zh_TW.utf8为默认编码。还可以将LANG=zh_CN.utf8作为参数传递给内核。
输入法可以使用uim-fep。
效果
据说,所有UTF-8的可打印字符,都是支持显示的。比尔盖子只测试了流行的CJK——Chinese, Japanese and Korean三种语言。
2018年12月30日 — 00:55
我将这个youbest的补丁修改了一下,现在它可以运行在4.10的内核上面了,但是某些字,包括但不限于中文,不知为何从侧面被削成一半,我在想这个补丁是怎么确定那些字是8×16那些是8×8的,应该可以修改使其变得正常,cjktty补丁。。。真的只有cjk,其他的全部乱了。。中文字形也有毛病,它到底是用的什么编码啊
2019年02月04日 — 05:29
内核的换行逻辑假定所有的字符都只有一倍的 ASCII 字符宽度,因此是不可避免的,除非对内核源码进行一定幅度的修改。另外,本文章中的信息已经过时了,原始的 Youbest 从文章发表后不久就没有使用了。一个更本的 CJKtty 曾经一直是 Gentoo-zh 社区的 microcai 在维护的,但是显然似乎他也不维护了。
2016年12月21日 — 07:05
你好,能不能说下用怎么用cjktty给内核打补丁,谢谢。
2014年09月19日 — 14:54
谢谢~~比尔盖子
我有一个问题:怎么改变它的字体,或者现在这个用的是怎么字体
2014年09月19日 — 18:30
这个补丁集已经过时了,请改用 CJKtty 补丁集。
字体是通过采样 GNU Unifont 得到的点阵字体,并且以 C 语言数组的形式存放在 .h 文件里。如果想更换是个技术挑战啊。
2013年12月16日 — 16:53
@比尔盖子
那我还是用youbest原来的补丁去编译2.6算了,反正我用rhel。
2013年12月16日 — 16:58
现在没人用 youbest 补丁了,都用 CJKTTY,自己搜索吧。
2013年12月15日 — 17:26
ERROR: "utf8_pos" [drivers/video/console/fbcon_ud.ko] undefined!
ERROR: "utf8_pos" [drivers/video/console/fbcon_cw.ko] undefined!
ERROR: "utf8_pos" [drivers/video/console/fbcon_ccw.ko] undefined!
ERROR: "fbcon_is_softback" [drivers/video/console/bitblit.ko] undefined!
这个怎么办?
2013年12月15日 — 20:34
这篇文章提供的信息已经过时了。回头更新下。
2012年08月09日 — 19:13
请问你提供的补丁和呢楠私语的有什么区别吗?为什么少了两个文件?
2012年08月11日 — 15:03
没有区别。但提供了Gentoo专用的补丁。少了两个文件是因为那是fbcon的补丁,没有意义。
2012年07月20日 — 09:36
使用N卡闭源驱动的先鼓捣分辨率,哈哈,感觉悲剧了~
2012年07月21日 — 09:24
呵呵。我也用N卡,也还没搞定分辨率。不是不会,曾经搞定过,是……忙着写这个了。回头写一篇分辨率的。
2012年07月19日 — 15:15
学习了
2012年07月19日 — 10:46
对内核还是不是很了解,一直也没能长时间的生存在Linux平台上,但是还是喜欢Linux