终端字体
十月 10, 2022 #console终端字体
tty UTF
TTY终端无法显示中文字符的原因,是内核无法渲染中文字符,我的理解是:因为中文字符的显示模式、宽度与英文字符不同, 默认输出英文字符的framebuffer(帧缓冲区)无法支持中文的完整显示。如果你使用SSH等其它方式,字符并不是由内核渲染输出,所以正常显示了。
让 linux TTY终端支持中文显示的方法有两种思路: 1、启动单独的虚拟终端程序,实现对中文字体的渲染。常见的zh-con、fbterm就是这个思路。但是这两个软件已经很久没有人维护更新了。
2、对linux内核打补丁,实现内核原生支持中文输出。 补丁名称:cjktty
现存方案状态
内核补丁:cjktty(保持更新中);univt-patches(保持更新中);
两个内核补丁均是 zhmars 大佬在发布维护更新
终端软件:kmscon(ARCH源内包上次更新在2020-7-9,基本没有功能更新,后面详细介绍这个方案及其衍生软件);fbterm(AUR上次更新在2022-01-17,依然有功能性更新);zhcon(AUR上次更新在2020-11-15,仅是更新了源码下载地址,并无功能更新)
总结与思考
参考cjktty作者原文,以及reddit的讨论,我总结了一下现有方案的思路:
linux原生TTY不支持中文,因为它是(VGA)文字模式的控制台,简单理解为一种打字机,里面仅包含了有限的字符(想象一下打字机的字模,一共只有那么多),无法囊括中文字库(类似当年林语堂先生发明明快打字机时面临的困局),想要修改这部分需要对内核进行大量改造,工作量巨大。
cjktty作者采用了变通方案,改造图形模式控制台支持unicode(包含中文),而图形模式控制台实际上就是linux图形化桌面的基础。 kmscon、fbterm等方案也是类似的思路,通过实现一种图形模式控制台来支持unicode(包含中文)。
copy
这些项目(systemd-consoled,kmscon)毫无意义。这个想法本身是有缺陷的。这可能是两者都被抛弃的根本原因。
内核 VT 子系统的正确替代品是一个用户空间窗口系统,该系统能够运行多个终端仿真器以及其他客户端,在它们之间切换,并执行基本的 WM 操作,例如最大化输出上的窗口。
当前的内核 VT 子系统实际上是一个原始的、非常有限的窗口管理器,具有内置的、非常有限的终端仿真器,两者都在不属于它们的内核空间中运行。试图在当前KMS / DRI / 输入设备模型之上的用户空间中重新创建此装置不可避免地会以运行自定义终端仿真器的自定义窗口系统结束,但为什么?要重写它?为什么不直接使用X + wm或Wayland合成器之一,并在那里运行终端模拟器。或者,如果它是自定义窗口系统,为什么要将其限制为终端仿真器?
我认为从事此类项目的人迟早会意识到,然后放弃他们的项目。
突出问题-->想象一下,一个系统在3x2显示器矩阵上运行一个窗口GUI,其排列方式使其形成一个巨大的桌面。用户请求切换到(用户空间或内核空间)VT。在这个组合屏幕上究竟应该发生什么?它与在GUI中启动多个终端窗口并以某种方式调整/重新排列它们有何不同?
历史证明,最初的Linux内核VT子系统确实有意义。当时,它是在某些BIOS功能之上构建的,BIOS有一个终端仿真器和一个可以在会话之间切换的"屏幕"的概念。然后Linux转向KMS / DRI / etc设备模型,这意味着具有多个可配置屏幕的裸图形设备。基于BIOS的旧VT代码被改编成在这种新模型之上的工作方式,以避免破坏当时的用户空间(软件),即使它不再有意义。反过来,用户空间的人们被推动开始考虑如何处理这种兼容性的混乱,最终应是从内核中删除(最初的Linux内核VT子系统)。
简单来说,当前虚拟终端不支持中文等大量UNICODE字符的原因主要是历史遗留(对最初的Linux内核VT子系统以及依赖它的软件的支持)。而cjktty、kmscon实现的东西均类似wayland等框架,但它们的功能仅限于对一个文字终端显示(输入)中文的支持,这些在wayland等高效的图形化框架的对比下略显多余(wayland增加的体积、负载等不多,但功能多太多了)。
作为对比,Windows是通过将图形化相关支持置入内核实现的,linux进行类似实现亦可行,只是会失去灵活性(不是很必要,知乎有相关讨论)。随着wayland等框架的推广,有望实现对传统虚拟终端的替代,内核将来的发展可能就会抛弃传统VT子系统,全转交给wayland等进行实现。所以cjktty作者说wayland或许是真正的解决方案。
可能未来一天,随着linux的普及,对图形化更加重视,TTY可能会淡出大家的视野,到时候TTY中文支持也就不再是问题了吧。
footprint
https://zhuanlan.zhihu.com/p/375460344 https://cloud-atlas.readthedocs.io/zh_CN/latest/linux/desktop/chinese/kmscon.html https://zhuanlan.zhihu.com/p/486542400