800 发表于 2006-7-31 23:27:28

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

loop2002 发表于 2006-8-2 16:52:02

我在 Suse 的系統下 ..
更改字型的排列確實會跟 locale 的語言有相關..

之前有是過語言設定為繁體中文,並把 MAC 的 STHiti 字型社為首要
可是就是不會以這個字型為優先 ..

後來有更改語言為簡體之後,就可以囉~~ ..

原因是 ..
因為 sthiti 是屬於簡體中文字,所以就必須是簡體的 locale 就會優先取用

quanliking 发表于 2006-8-14 10:42:48

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]
查看完整版本: fontconf字体替换的奇怪问题