比尔盖子 博客

在Linux终端机上,显示中文等多种UTF-8文字

在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三种语言。

 

CJK完美显示

CJK完美显示

Categories: IT生活, Linux

折腾Nvidia分辨率,启用uvesafb » « iOS下的Unix命令行软件包

15 Comments

  1. 我将这个youbest的补丁修改了一下,现在它可以运行在4.10的内核上面了,但是某些字,包括但不限于中文,不知为何从侧面被削成一半,我在想这个补丁是怎么确定那些字是8×16那些是8×8的,应该可以修改使其变得正常,cjktty补丁。。。真的只有cjk,其他的全部乱了。。中文字形也有毛病,它到底是用的什么编码啊

    • 不知为何从侧面被削成一半

      内核的换行逻辑假定所有的字符都只有一倍的 ASCII 字符宽度,因此是不可避免的,除非对内核源码进行一定幅度的修改。另外,本文章中的信息已经过时了,原始的 Youbest 从文章发表后不久就没有使用了。一个更本的 CJKtty 曾经一直是 Gentoo-zh 社区的 microcai 在维护的,但是显然似乎他也不维护了。

  2. 你好,能不能说下用怎么用cjktty给内核打补丁,谢谢。

  3. 谢谢~~比尔盖子
    我有一个问题:怎么改变它的字体,或者现在这个用的是怎么字体

    • 这个补丁集已经过时了,请改用 CJKtty 补丁集。

      字体是通过采样 GNU Unifont 得到的点阵字体,并且以 C 语言数组的形式存放在 .h 文件里。如果想更换是个技术挑战啊。

  4. @比尔盖子
    那我还是用youbest原来的补丁去编译2.6算了,反正我用rhel。

  5. 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!

    这个怎么办?

  6. 请问你提供的补丁和呢楠私语的有什么区别吗?为什么少了两个文件?

  7. 使用N卡闭源驱动的先鼓捣分辨率,哈哈,感觉悲剧了~

  8. 学习了

  9. 对内核还是不是很了解,一直也没能长时间的生存在Linux平台上,但是还是喜欢Linux

发表评论

Your email address will not be published.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax

Copyright © 2023 比尔盖子 博客

Theme by Anders NorenUp ↑