Fontconfig 字体顺序配置问题

安装完 Noto Sans CJK SC 字体为什么就自动设置为默认字体?从 fc-match 命令看 serif 和 sans-serif 都被改成了 Noto Sans CJK SC 了。
打开 /usr/share/fontconfig/conf.avail/65-nonlatin.conf 看里面并没有 Noto San CJK 的设置。自己的用户配置 ~/.config/fontconfig/fonts.conf 也不存在(用户不手动新建的话是不存在的),所以也不是用户配置覆盖了系统配置的问题啊。现在是不知道怎么设置,在不新建个人配置文件的情况下,调整 serif 的默认字体。

另外 /usr/share/fontconfig/conf.avail/65-nonlatin.conf 里 serif 为什么会有 WenQuanYi Zen Hei ?这明显是黑体啊。sans-serif 里有 SimSun 和 WenQuanYi Bitmap Song 和其他宋体?这个是本地化工作设置的错误吗? xuexiii.org/index.php/Font_Config 这里也提到过默认字体设置的问题。

尝试卸载掉 Noto Sans CJK 包,再次 fc-match 显示的都是 Droid Sans Fallback 了,不知道字体的优先顺序由哪个文件配置的。以前在 openSUSE 13.2 是修改 58-suse-post-user.conf 文件就可以的,现在这个文件已经不存在了,在 conf.avail 文件夹里找到 65-nonlatin.conf 文件,修改后没有效果,也许是更改配置方法了。有谁知道怎么配置吗?难道要跑到 sysconfig 里面改?

suse.com/documentation/sled-12/book_sle_admin/?page=/documentation/sled-12/book_sle_admin/data/sec_x11_fontsys.html
在这里说全局设置需要编辑 /etc/fonts/local.conf ,然后我就复制 65-nonlatin.conf 文件里的内容到里面,fc-match 显示没有效果。

试以下 fontweak , 挺好用的. 可以帮你根据语言设置不同的字体 fallback.

安装完后打不开,不知道为什么,Tumbleweed,而且我要的是全局设置,不想配置成个人的。

命令行打开看看有什么错误. 想要全局配置也不过是从个人主目录下将配置文件复制到 /etc 下而已.

fontweak
十一月 05, 2015 2:51:36 下午 me.guoyunhe.fontweak.FontConfigXML readConfig
严重: null
java.io.FileNotFoundException: /home/wsxy162/.config/fontconfig/fonts.conf (没有那个文件或目录)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:623)
	at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
	at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:205)
	at me.guoyunhe.fontweak.FontConfigXML.readConfig(FontConfigXML.java:152)
	at me.guoyunhe.fontweak.FontConfigXML.readConfig(FontConfigXML.java:185)
	at me.guoyunhe.fontweak.MainWindow.initApplication(MainWindow.java:904)
	at me.guoyunhe.fontweak.MainWindow.<init>(MainWindow.java:62)
	at me.guoyunhe.fontweak.MainWindow$14.run(MainWindow.java:881)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at me.guoyunhe.fontweak.FontConfigXML.readConfig(FontConfigXML.java:160)
	at me.guoyunhe.fontweak.FontConfigXML.readConfig(FontConfigXML.java:185)
	at me.guoyunhe.fontweak.MainWindow.initApplication(MainWindow.java:904)
	at me.guoyunhe.fontweak.MainWindow.<init>(MainWindow.java:62)
	at me.guoyunhe.fontweak.MainWindow$14.run(MainWindow.java:881)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

权限问题吗?就再次 sudo 下了

sudo fontweak
root's password:
Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
	at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
	at java.awt.Window.<init>(Window.java:536)
	at java.awt.Frame.<init>(Frame.java:420)
	at java.awt.Frame.<init>(Frame.java:385)
	at javax.swing.JFrame.<init>(JFrame.java:189)
	at me.guoyunhe.fontweak.MainWindow.<init>(MainWindow.java:57)
	at me.guoyunhe.fontweak.MainWindow$14.run(MainWindow.java:881)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

又显示没有设置 X11 DISPLAY 变量,一直用的自带的驱动。

这不是很显然说了没有 ~/.config/fontconfig/fonts.conf 这个文件么? 自己创建一个, 系统的配置文件应该是 /etc/fonts/fonts.conf, 基本的内容为:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>

  <!-- settings go here -->

</fontconfig>

不要只是创建空白文件, 不然还是会报错的. 你可以考虑到 github 上开个 issue 提一下这个, 我比较懒才没去提. 添加一个检测配置文件是否存在的功能应该不会太复杂的.
参考 wiki.archlinux.org/index.php/Font_configuration_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#Fontconfig.E9.85.8D.E7.BD.AE

创建过,不过没想过还不能是空白文件。

看了下生成的文件里的语法,跟 suse.com/documentation/sled-12/book_sle_admin/data/sec_x11_fontsys.html#ex_x11_fontsys_fontconfig_aliases1 里的不一样啊。
fontweak 用的语句是


sans-serif


zh-cn


Bitstream Charter

以前编辑 local.conf 用的是下面这样的

serif

DejaVu Serif

不知道为什么下面这个不支持了?

另外如果是在 yast2-font 组件下修改字体顺序,是修改 /etc/sysconfig/fonts-config 里的参数,就是系统全局的,而 fontweak 是配置个人的,功能一致,fontweak 多了个保存方案的功能。

yast2-font 的设置我没有留意过, 不太清楚啊.

然后我想当然的 serif 衬体字就该用 宋体或仿宋 字体嘛,结果适配出来——好丑。serif 和 sans-serif 之类的分类还是比较适合于拉丁字母吧。用宋体字来显示文章或大片文字效果挺好,但是很多程序的菜单字体都默认 serif ,结果那伶仃几个字用宋体显示,太瘦了,看着费眼睛,还是用回黑体吧。Tumbleweed 下默认没有安装 wqy 字体,中文用的 Droid Sans ,不过 wqy-zenhei 也是从 Droid Sans 改过来的,没多大差别。装个雅思黑体完事,不折腾字体了。

中文字体推荐使用思源黑体, 质量很不错的.

昨天关掉论坛的时候就在想,是不是写错字体名了,原来真写错了。我是想表达思源,但是雅思这个名字比较顺口,写错了。