fontconf字体替换的奇怪问题
假设fonts.conf中有如下内容:<alias>
<family>xyz</family>
<prefer>
<family>Bitstream Vera Sans</family>
<family>SimSun</family>
</prefer>
<accept>
<family>Webdings</family>
</accept>
<default>
<family>abc</family>
</default>
</alias>
按照文档的说法,fontconf会先找prefer列表中的字体。找不到,则去找名为xyz的字体。还没有接着找accept,最后找default。可实际情况并不是这样。
$ LANG=zh_CN fc-match xyz
simsun.ttc: "SimSun" "Regular"
$ LANG=C fc-matchxyz
Vera.ttf: "Bitstream Vera Sans" "Roman"
也就是说,match到的字体还跟locale有关。如果是这样,字体替换岂不是根本无法实现?
测试用系统是archlinux
fontconfig 2.3.2-6
freetype2 2.1.10-4 我在 Suse 的系統下 ..
更改字型的排列確實會跟 locale 的語言有相關..
之前有是過語言設定為繁體中文,並把 MAC 的 STHiti 字型社為首要
可是就是不會以這個字型為優先 ..
後來有更改語言為簡體之後,就可以囉~~ ..
原因是 ..
因為 sthiti 是屬於簡體中文字,所以就必須是簡體的 locale 就會優先取用 fontconfig 的字体匹配算法和 locale 关系紧密,语言特性具有很高的优先级。比如:
<alias>
<family>sans-serif</family>
<prefer>
<family>Arial</family>
<family>SimSun</family>
</prefer>
</alias>
Arial 是排在 SimSun 前面的,按一般思维来说,应该先使用 Arial 的英文。
但如果你的 locale 为 zh_CN.UTF-8,Arial 的 lang 参数不含 zh-cn,而 SimSun 的 lang 参数包含 zh-cn,则优先使用 SimSun,用下面命令查看:
$ LANG=zh_CN.UTF-8 fc-match sans --sort
simsun.ttc: "SimSun" "Regular"
Arial.ttf: "Arial" "Regular"
......
如果讲 locale 改为 en_US.UTF-8,则优先使用 Arial,道理同上。
$ LANG=en_US.UTF-8 fc-match sans --sort
Arial.ttf: "Arial" "Regular"
simsun.ttc: "SimSun" "Regular"
......
可以通过强绑定机制,强行优先使用你喜欢的字体:
<match target="pattern">
<test name="family" >
<string>SimSun</string>
<edit name="family" mode="prepend" binding="strong">
<string>Arial</string>
</edit>
</match>
不过这种处理问题多多,这也是 fontconfig 匹配算法很大争议的地方。
页:
[1]