学会配备 Fontconfig,让 Linux 中文字体比较顺心

2024-10-26

与我们熟悉的相比 Windows,用户在用 Linux 在发行版的过程中,我们或多或少会面临各种字体显示问题,对使用体验影响很大。我相信很多用户,包括我,都很痛苦。


下面的情况,或许你遇到过:


  • 没有熟悉的宋体、楷体、仿宋等字体,就无法顺利使用。 Linux 下办公
  • 当系统语言不是简体中文时,简体中文变成了日韩风格,极大地影响了观感。
  • Windows 下的「点阵字体」(字体的 hinting 升级)也出现了 Linux 里
  • 安装第三方字体后,系统显示的中文字体会变成刚刚安装的字体
  • 还有其它潜伏的问题…

但是,不要被这些问题吓到。了解了 Linux 字体配置机制,探索问题的本质,这些问题其实都是小事,都可以用有针对性的方案一一打破。从此,Linux 还有就是不输给 Windows 使用体验,对于目前市企的计算机产业化,以及普通用户的日常使用。 Linux 场景,都有很大的好处。


背景知识:Linux 没有字体,字体就无法生存 Fontconfig


在 Linux 在这些字体中,字体是由 fontconfig 来统一管理的,它是由 Free Desktop 推出的字体管理工具,通用于各大发行版,甚至在 Windows 下部也可以使用。


Fontconfig 具有开箱即用的便利性,能自动扫描特定目录下的所有字体。使用 Windows 用户可能会有这样的体验:直接将字体文件放入 C:\Windows\Fonts 可以在目录下安装。在Linux中,这也可以做到——你只需要把字体放在指定的目录下,通常是系统字体目录(/usr/share/fonts或者用户字体目录(例如 ~/.fonts/)。


但是,另一方面,fontconfig 它是由环境变量驱动的。环境变量的合理性直接关系到 Linux 字体显示的表现。Fontconfig 选择环境变量 XML 格式,支撑功能特性极强;相应地,它的参数种类繁多,有一定的门槛。如果你想合理地配置字体,你需要付出很大的努力。


幸好,这个教程只需要使用。 fontconfig 环境变量的一小部分功能,包括储备字体配置、禁用 hinting 功能。需要写的东西 XML 自然而然,代码量也少了许多。


然后,下一步,笔者将根据几个常见的问题情况,为大家提供各种解决方案。并且看看下面的分解。


注:阅读本文,您需要了解XML 文件基础知识 。



安装基本字体,解决中文字体不显示的问题。


现在的 Linux 发行版,其默认字体为 Noto 该系列为大宗,中文字体为对应 Noto CJK 系列,一般各大发行版都有自己的。


但是如果你使用它 Arch Linux、Alpine 这些需要「纯手工」配有操作系统,这些字体包不会默认安装,需要手动安装。中文字体一旦漏掉,那么在显示中文的地方,你只能看到一片空白,或「豆腐块()」。更麻烦的是,如果你错过了英文字体,系统的默认语言是英文,那么你只能面对广阔的空白,只能面对界面。「干瞪眼」。


为了解决这一问题,只需安装相应的发行版本 Noto 字体包,可以解决最基本的文字显示问题。以下是发行版的一些安装指令:


# Arch Linux。noto-fonts是西方字体,noto-fonts-中日韩文字体cjk


sudo pacman -S noto-fonts noto-fonts-cjk


# Ubuntu


sudo apt install fonts-noto-core fonts-noto-cjk


# Alpine


sudo apk update


sudo apk add --upgrade font-noto font-noto-cjk


# Void Linux


sudo xbps-install -Su noto-fonts-ttf noto-fonts-cjk



另外,如果您想使用第三方字体作为界面显示字体, Noto 字体包并非刚需。您只需将您喜欢的字体复制到发行版本的字体目录中,例如, Arch Linux 字体目录为/usr/share/fonts/


注:为了方便管理,请将字体文件放入字体文件夹的二级目录中,例如 /usr/share/fonts/TTF(或 /usr/share/fonts/ 下面的其它子目录)。



正确设置区域,处理字体显示混乱的问题


Linux 系统的区域(locale)设置直接关系到系统显示的语言、时间格式和数字格式。如果区域设置不符合标准,系统将使用内置默认区域「C」,这会导致字体显示异常,例如:


  • 应用于终端(例如 Konsole)当中文输入并按下退格键时,文字仍然存在,但只显示一半。
  • Oh My 使用特殊符号的终端扩展,如Zsh,在使用时会出现乱码。
  • 有些软件在显示中文时可能会出现乱码。

为了解决字体显示问题,您需要进入桌面环境「区域设置」,把区域设定为正确的数值。


确保目标区域已被激活

Linux 发行版为世界各地的各种语言提供了区域支持。通常就像 Ubuntu、Deepin、Zorin OS、银河麒麟这些新手发行版,默认情况下已经为您配置好了。但是对于 Arch Linux 这些需要「纯手工」发行版的安装,通常需要我们自己检查和激活区域支持。


一般而言,我们必须保证至少开启英文、简体中文的区域支持。


第一步:用 root 文本编辑器的权限打开/etc/locale.gen,找出下面几行,把它们前面的井号(「#」)删除,然后存储:


#en_US.UTF-8 UTF-8


...


#zh_CN.UTF-8 UTF-8



第二步:下列指令在终端上运行,使系统能够重新激活区域支持:


sudo locale-gen



命令执行结果如下:


sudo locale-gen


Generating locales...


en_US.UTF-8... done


zh_CN.UTF-8... done


Generation complete.



提醒:如果您还需要其他区域的支持,则取消相应的注释。例如,如果您想使用日语支持,请取消注释ja_JP.UTF-8 UTF-8这一行。


设置桌面环境中的区域

常用的桌面环境,一般在各自的桌面环境中。「系统配置」在系统中提供语言设置的入口,不同桌面环境的入口也不一样。详情请参考每一个发行版本和桌面环境的文档。


  • Gnome:在「活动面板(Activities)」中,输入「Region & Language」
  • KDE:开启「系统配置(System Settings)」→「区域语言(Region & Language)」→「语言(Language)」
  • Cinnamon:开启「系统配置(System Settings)」→「语言(Languages)」
  • Deepin、UOS:开启「监测中心」→「键盘和语言」

对轻量级的桌面环境

一些轻型桌面环境没有配备区域设置,例如 MATE Desktop。此时,您可以使用第三方软件mintlocale完成设置,这是 Linux Mint 语言设置工具,通常用于其它发行版本。


Arch Linux 使用者可直接接受 AUR 安装(假设你已经安装了Yay这个模型 AUR 助手):


yay -S mintlocale



运行在终端上 mi ntlocale,然后根据您的需要,依次设置以下参数:



在中国,你需要把这些基本参数作为正确的参数。/地域、语言,例如中国大陆的简体中文。「Chinese, China」。



mintlocale 的页面


设置完成后,点击「Apply System-Wide」,全局应用区域设置。在此期间,您将被要求输入密码(这个设置需要 root 权限)。


最后,重新启动计算机,就可以起作用了。由于区域设置造成的字体问题得到了解决。


安装 Windows 处理办公室缺乏字体的字体问题


声明:


由于隐藏的许可条款, Windows 内置字体存在一定的法律风险。


这类字体应用于个人和非商业场所;商业场所应当获得字体版权所有者的授权。



长久以来,政府、商务办公等领域的主流操作系统都是 Windows。这种背景下,Windows 自带中易宋体(SimSun)、仿宋(SimFang)、楷体(SimKai)、Times New Roman 等待字体成为标准字体;用于界面显示的微软雅黑等字体也深受人们的喜爱,是PPT制作的必备字体。


但是,由于上述字体涉及授权许可问题,因此不会随之而来。 Linux 发行版本提供。一些开发者还制定了这些字体的开源。「平替」,比如 UKai、UMing,但是它们的显示效果仍然和 Windows 自带字体有明显差异,无法完全替代。


所以,如果你需要用的话 Linux 办公室,尤其是在城市企业中使用,那么就有必要了。 Windows 这些字体安装在系统中。


通用方法:直接存在 Windows 中拷贝

最直观、最简单的方法,就是从一个 Windows 在计算机中获取字体。


  • 第一步,您可以直接进入 Windows 字体目录(如C):\Windows\Fonts选择你想要的字体,然后按下它们。 Ctrl C 复制,粘贴到可移动磁盘上,或刻录成光盘,等等。


在 Windows 在字体目录中,选择要导出的字体。


  • 第二步,在你的 Linux 在电脑上插入硬盘或光盘,您保存了字体。打开文件管理器,浏览硬盘或光盘的路径,右击空白选择「开启终端」(或者其它类似的选项)。
  • 第三步,下列指令在终端上运行,将字体复制到 Linux 字体目录的发行版本。小心,你需要 root 权限。

# 建立一个特殊的子目录,存储来自Windows的字体


sudo mkdir /usr/share/fonts/Windows_TTF/


# 由于Linux下的文档区分大小写,所以我们要考虑大小写,这样所有的字体都可以复制到目标位置。


sudo cp *.TTF *.ttf *.OTF *.otf /usr/share/fonts/Windows_TTF/



  • 第四步,fc在终端上运行-cache,刷新字体缓存,使变更有效:

fc-cache -v



假如你是 Arch Linux 顾客:可以安装 AUR 包


假如你是 Arch Linux 以及其衍生版本(例如 Manjaro)对于用户来说,AUR里面提供了几组字体安装包,可以非常方便。 Arch Linux 补充 Windows 必备字体。


在构建过程中,它会立即从微软官方镜像中获取字体文件,所以在整个安装过程中需要保持网络畅通。


这类包包有以下几种:



对简体中文客户,笔者建议选择基于简体中文的客户。 Windows 11 袋子,以确保字体更新。您可以使用 Yay 进行施工:


yay -S --noconfirm ttf-ms-win11-auto ttf-ms-win11-auto-zh_cn ttf-ms-win11-fod-auto-hans



以上三个包,包括下列字体:



这些字体安装完成后就可以使用了。


注意:


使用httpdirfs远程在线挂载微软官方在线。 ISO 镜像,因此需要全程保持网络畅通。根据网络环境的不同,安装速度也不同,请耐心。


AUR 还有没有提供? auto 文字包(例如 ttf-ms-win11),但作者不建议安装,因为它需要你自己下载安装镜像,并且自己提取镜像中的文档,非常麻烦。



设置储存字体,显示处理字体。「变色龙」的问题


按照上一章的流程安装 Windows 在字体之后,你可能会发现这样一种情况:中文字体发生了变化。


原本统一使用 Noto Sans CJK 字体显示(和 Android 默认字体是一样的),但是现在却莫名其妙地变成了微软雅黑,甚至是仿宋和楷体。


如果你的系统语言不是简体中文,或者软件的字体设置为英文字体(例如,Hack Nerd Font),然后在显示简中汉字时就会出现问题:字形并非大陆标准字形,而是变成日文甚至韩文的汉字字形。


那这个问题又该怎么处理呢?



在日文系统环境下,Bing 搜索结果,可以看出这里混杂着 MS Gothic 两种字体,微软雅黑。


「罪魁祸首」:Fontconfig 后备字体机制

造成上述两种情况的原因, fontconfig 的后备字体(fallback font)机制。当显示一个字体而目前没有这个字体时,它会自动选择另一个字体来显示。


若储备字体配置不当,fontconfig 然后按照特定的规则选择字体,比如你刚刚安装了字体,这样字体显示就会变得非常非常明显。「怪异」。


下一步,不妨对前面提到的两个问题进行进一步分析。


  • 看看第一个问题。如今的桌面环境,默认字体都是英文字体,例如 Noto Sans。这类字体不包含中文字符,一旦显示中文字符,就会触发。 fontconfig 后备字体机制。在安装 Windows 在字体之前,计算机没有其它中文字体,所以自然会选择。 Noto Sans CJK;但是,在安装了仿宋、楷体等中文字体之后,fontconfig 有了「新选择」,原来的后备字体就被顶掉了。
  • 再次看看第二个问题。对多语言环境,fontconfig 根据系统语言选择相应语言的字体,例如,在日语环境中选择相应的字体。 Noto Sans CJK JP、MS Gothic 等。但是,日文字体并不包含简体汉字,因此在显示简体汉字的地方,同样会触发 fontconfig 新安装的中文字体优先考虑后备字体机制。所以,同样会导致字体显示效果变得怪异。

所以,只有正确的配置 fontconfig 后备字体,可以改善字体的显示性能。


储备字体怎样配置?

下一步,我们将编写一个 fontconfig 环境变量,为常见字体配置一个储备字体序列。


  • 第一步:目录为客户主目录.config在fontconfig子目录下,创建文件fonts.conf。如果没有这个目录,就新建一个。
  • 第二步:打开fonts.conf,填写以下内容。请务必根据您的具体情况,参考代码中的注释进行修改。

注:如果fonts.如果conf已经有了内容,所有的节点 XML 现有的节点都增加了节点里。









Cantarell




DengXian


Noto Sans CJK SC






Hack Nerd Font



Noto Sans CJK SC





Noto Sans



Noto Sans CJK SC





Noto Sans Mono



Noto Sans Mono CJK SC


Noto Sans CJK SC





Noto Serif



Noto Serif CJK SC






MS Gothic



SimHei


Noto Sans CJK SC





sans-serif



Noto Sans CJK SC






第三步:写完 fonts.conf 之后,刷新字体缓存。请注意这里的 fc-cache 需要带上 -f 强制刷新参数,否则储备字体可能无效。


fc-cache -f -v



在完成字体缓存刷新后,再次打开应用程序,您可以看到更改的效果。



设定储存字体的效果。尽管这是 Noto Sans CJK SC 与 JP 掺杂,但确实比设置前协调多了。


按上述方法设置后,您的计算机字体显示将非常稳定,不会出现字体显示不统一等问题。


注:储备字体设置仅对 fonts.conf 这些字体中的字体是有效的。若您还使用其它字体,则需增加相应的配置。



禁用 Hinting,处理特定字体显示效果拉胯的问题


熟悉 Windows 每个人都知道,现在 Windows 在这些屏幕中,如果屏幕分辨率和缩放率很低,那么一些字体显示出来的效果就是一言难尽,例如:


  • 宋体,细明体(PMingLiU)、MS Gothic、MS Mincho 等待东亚语言字体,全部显示为点阵
  • 微软雅黑的显示效果和印刷效果完全不同

上述现象的产生,是因为这些字体自带了这些现象。 hinting(字体微调)数据将显示特定字体大小下特别设计的位图字体。这就是宋体的点阵。这项技术的初衷是保证屏幕页面的文字在低分辨率下仍然能够清晰显示,但随着高分辨率屏幕的普及,这项技术现在拖累了显示效果的后腿。


遗憾的是,Linux 字体渲染发行版也支持 hinting。所以,是一样的 Windows 如果安装了字体 Linux 在这种情况下,你也要面对让你一言难尽的显示效果,不清楚用什么语言来形容。



以国考报名系统为例。输入框中的提醒文字为宋体,但由于 hinting 并且显示出我们熟悉的点阵


幸好,同样是通过配备的。 fontconfig,这些字体很容易被我们禁用。 hinting 功能。


  • 第一步:打开客户主目录.config/fontconfig/fonts.conf。如果没有,那就新建一个。
  • 第二步:在 补充和补充节点 hinting 设置相关节点。每一个字体对应一个 节点。






宋体




false





  • 第三步:设定后,更新字体缓存:

fc-cache -fv



通过这种方式,重新打开相应的程序,你会发现字体渲染有了明显的改善:



禁用 hinting 之后,没有点阵,宋体的显示效果与印刷效果一致。


写在最后


用于日常使用 Arch Linux 作者,作者一直致力于使自己的计算机更舒适地使用,尤其是字体显示。


上述经验,就是我自己在做什么。「调试」Arch Linux 字体显示是一步一步积累起来的。现在屏幕上的字体显示特别舒服,无论是日常使用还是作为最重要的办公室,都是和谐的。 Windows 无与伦比,扫清了顾忌,迎来了舒适。


假如你每天都像我一样使用它 Linux,或是因为工作需要而离不开 Linux──尤其是国产电脑,国产电脑,国产电脑,市企统一配备。 Linux 发行版,所以希望这个教程能对你有所启发。


原文链接

https://sspai.com/post/92955?utm_source=wechat&utm_medium=social


本文来自微信微信官方账号“少数派”(ID:sspaime),作者:爱拼安小匠,责编:北邈,36氪经授权发布。


本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。

免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com