xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
阅读:14189回复:25

请教,火狐3.6的“字体链接”机制是怎样的?

楼主#
更多 发布于:2010-08-10 22:31
首先,其实我不确定火狐是否存在“字体链接”这一概念的,如果说错了,请见谅。我所指的“字体链接”,其实是指:
当前页面有字符超出用户设定的字体的收录范围时,程序自动调用其它字体来显示该字符。

在WINDOWS系统下,是利用“字体链接”技术来实现上述效果的。只要用户预先在注册表中设置好字体链接的名单,例如在宋体的链接名单下加上其它字体,那么当系统遇到宋体无法显示的字符时,就会根据链接名单,去调用名单上的字体来显示该字符。
由于我不知道火狐实现这种效果是通过什么来实现的,所以只好暂时把它也称作“字体链接”。

言归正题。我发现火狐浏览器对于一些字符的显示支持,好像做得不太好。

就以“”“”两字为例。
这两个字是宋体没有收录的,若然在火狐中把字体设置为“宋体”,两个字体都会显示为两个方框。唯有特意把火狐字体设置中的字体设为有收录这两个字符的字体,例如“新宋体”,这两个汉字才能正常显示。

但是,以上两个字体,若用IE浏览,则无需特别设置,均可正常显示。

还有,这个链接中http://bbs.unispim.com/viewthread.php?tid=9663&page=1&fromuid=43337#pid64811(紫光拼音论坛,无毒),有三个字符,也是在火狐用宋体浏览时无法正常显示。火狐要想正常显示这三个字符,必须特意把字体改为“新宋体”等有收录这些字符的字体。同样地,若用IE浏览,则无需特意设置,均可正常显示。

所以我不明白,当网页中有一些字符,是用户设定好的字体所没有收录时,火狐是会怎样处理的呢?为什么IE仍然能够正常显示,而火狐则需要用户人工干预变换字体,才能正常显示那些字符呢?

后来,在显示Unicode CJK扩展A区汉字的表现上,通过对比火狐和IE,我发现了一个现象。

首先说面一下,为了能够正常显示CJK 扩展A区的汉字,我电脑里安装有Sun-ExtA这款收录有A区汉字的宋体字型字体。此外,虽然我是用XP SP3系统,但我也手动安装了微软雅黑体,微软雅黑体也已经收录了扩展A区的汉字。那么,当遇到宋体没有收录的扩展A区汉字时,IE和火狐会有什么表现呢?到底会调用哪款字体去显示呢?

用作测试的是这三个位于扩展A区的汉字:㷫、㓥、㗎
测试结果见链接:http://bbs.unispim.com/viewthread.php?tid=9663&page=1&fromuid=43337#pid65736

大家也可以复制这三个字符,用GOOGLE搜索一下这三个汉字,也是可以看到显示效果的。

结果是:火狐调用雅黑体去显示这三个汉字,而IE则用Sun-ExtA字体来显示这三个汉字

我发现,IE在处理这些字符时,会严格遵循系统注册表中的字体链接设置来行事(附件有我的字体链接的截图);而火狐似乎不会执行系统的字体链接设置,而只会调用雅黑体

所以我推测,火狐浏览器当遇到用户设定好的字体没有收录的字符时,只会调用微软雅黑体来补救,一旦微软雅黑体也没有收录这些字符,那么火狐就“无能为力”了。如上文的红色的那两个汉字,就是宋体、雅黑体都没有收录到的。这些汉字是位于GBK编码PUA区域的。只有宋体-PUA、新宋体、宋体-18030字体收录了。因此,火狐遇到上述汉字时,由于不懂得调用雅黑以外的字体,就不能显示了;而IE由于懂得调用其它字体来补救,就得以正常显示上述汉字了。

由此,我想,鉴于火狐本身是一个具有强大可定制性的浏览器,那么有没有一种办法,改变火狐的“字体链接”,让火狐在遇到一些当前字体没有收录的字符时,不去调用雅黑体,而是调用用户自定义的字体。例如,宋体-18030收录的汉字比雅黑更齐全,那么有没有办法,让火狐遇到一些当前字体没有收录的字符时,自动调用宋体-18030来“补救”,而不是调用雅黑体呢?

我已经被这个问题困扰了很久了,一直摸索不了答案,所以就唯有上论坛来求救了。希望各位指点一下迷津吧,谢谢了
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
1楼#
发布于:2010-08-10 22:31
http://www.pkucn.com/viewthread.php?tid=251479&page=2#pid1218721501

该贴倒数第二行有乱码,乱码字符属于GBK的PUA区域 E815-E864。

网页是GBK编码的,而这些乱码字符也是属于GBK规范的,不知为何不能正常显示?

这个问题我也在紫光拼音的论坛跟人请教过,应该跟字体链接无关,是火狐程序本身对GBK的某些区域的解码存在问题,这个就涉及到程序本身问题,跟设置无关了。
freeeman
小狐狸
小狐狸
  • UID29969
  • 注册日期2009-08-06
  • 最后登录2012-06-12
  • 发帖数45
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
2楼#
发布于:2010-08-10 22:31
http://www.pkucn.com/viewthread.php?tid ... 1218721501

该贴倒数第二行有乱码,乱码字符属于GBK的PUA区域 E815-E864。

网页是GBK编码的,而这些乱码字符也是属于GBK规范的,不知为何不能正常显示?
skmi7
狐狸大王
狐狸大王
  • UID26753
  • 注册日期2008-10-22
  • 最后登录2022-04-19
  • 发帖数339
  • 经验56枚
  • 威望0点
  • 贡献值14点
  • 好评度5点
  • 社区居民
  • 忠实会员
3楼#
发布于:2010-08-10 22:31
安装了宋体-18030字体.
在about:config里添加了还是无法显示.
不知道是什么原因.
freeeman
小狐狸
小狐狸
  • UID29969
  • 注册日期2009-08-06
  • 最后登录2012-06-12
  • 发帖数45
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
4楼#
发布于:2010-08-10 22:31
benny2

这贴没问题见图,编码选择GB18030
回到原帖


编码选择GB2312或GB18030是可以显示,但网页缺省是GBK啊,即便你设置了,刷新一下又变回GBK。
你可以在百度贴吧或北大中文论坛,发一个测试帖试一下就知道。

比如
http://www.pkucn.com/viewthread.php?tid ... 1218721501
这个帖子(24楼)里倒数第二行就显示不正常。

另外,最后一行是自造字,注册表册Fontlink已经追加该字体到宋体,但是设置为宋体却看不见,必须设置为自造字的字体才看得见。

以上问题,IE均不存在。
benny2
小狐狸
小狐狸
  • UID10800
  • 注册日期2005-12-26
  • 最后登录2020-09-03
  • 发帖数93
  • 经验44枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
  • 忠实会员
5楼#
发布于:2010-08-10 22:31
freeeman:按介绍的方法设置了CONFIG,但是还是不行。
比如以下网页的#14 #15楼,还是存在乱码。

http://tieba.baidu.com/f?kz=920024261
回到原帖


这贴没问题见图,编码选择GB18030
freeeman
小狐狸
小狐狸
  • UID29969
  • 注册日期2009-08-06
  • 最后登录2012-06-12
  • 发帖数45
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
6楼#
发布于:2010-08-10 22:31
按介绍的方法设置了CONFIG,但是还是不行。
比如以下网页的#14 #15楼,还是存在乱码。

http://tieba.baidu.com/f?kz=920024261
freeeman
小狐狸
小狐狸
  • UID29969
  • 注册日期2009-08-06
  • 最后登录2012-06-12
  • 发帖数45
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
7楼#
发布于:2010-08-10 22:31
按介绍的方法设置了CONFIG,但是还是不行。
比如以下网页的#14 #15楼,还是存在乱码。
royallin
非常火狐
非常火狐
  • UID29014
  • 注册日期2009-05-31
  • 最后登录2016-12-07
  • 发帖数668
  • 经验46枚
  • 威望0点
  • 贡献值32点
  • 好评度0点
  • 社区居民
8楼#
发布于:2010-08-10 22:31
xiss_fowu

宋体-18030也不行么?这就奇怪了。

你看看你的系统安装了 宋体-18030这款字体没有?宋体-18030不是XP自带的字体来的,要另外自己安装的。
回到原帖

难怪,原来这字体要安装。
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
9楼#
发布于:2010-08-10 22:31
royallin:liuxb 写道:
谢谢楼主的分析
测试了下,和楼主的结果稍有不同
==========
结果令人鼓舞,所有原来变成方框的字符都顺利显示了,不再需要专门跑去“工具-选项”里改字体了。
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里也不再以雅黑字体示人了,改以我设定的宋体-18030字体示人了。
==========
我这里是
原来变成方框的字符都顺利显示了,字体用的是宋体-pua.
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里仍然是用的雅黑显示的.

似乎雅黑的优先级要高一些.
系统是win7 32位 英文版

你是在字体清单里面添加了宋体-PUA字体么?如果是这样的话,那么火狐应该还是会调用雅黑来显示扩展A区的字符。因为宋体-PUA并收录有扩展A区的字符。

不过,如果用宋体-PUA,这个帖子中的字符则应该全部能够正常显示的了,你不妨试试:http://bbs.unispim.com/viewthread.php?tid=9663&page=1&fromuid=43337#pid64809

-----------------------------------
我也是用宋体-PUA后才可以正常显示全部,如果用楼主说的宋体-18030的话还是不能正常显示。

XPSP3,没有装雅黑。
回到原帖


宋体-18030也不行么?这就奇怪了。

你看看你的系统安装了 宋体-18030这款字体没有?宋体-18030不是XP自带的字体来的,要另外自己安装的。
royallin
非常火狐
非常火狐
  • UID29014
  • 注册日期2009-05-31
  • 最后登录2016-12-07
  • 发帖数668
  • 经验46枚
  • 威望0点
  • 贡献值32点
  • 好评度0点
  • 社区居民
10楼#
发布于:2010-08-10 22:31
liuxb 写道:
谢谢楼主的分析
测试了下,和楼主的结果稍有不同
==========
结果令人鼓舞,所有原来变成方框的字符都顺利显示了,不再需要专门跑去“工具-选项”里改字体了。
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里也不再以雅黑字体示人了,改以我设定的宋体-18030字体示人了。
==========
我这里是
原来变成方框的字符都顺利显示了,字体用的是宋体-pua.
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里仍然是用的雅黑显示的.

似乎雅黑的优先级要高一些.
系统是win7 32位 英文版

你是在字体清单里面添加了宋体-PUA字体么?如果是这样的话,那么火狐应该还是会调用雅黑来显示扩展A区的字符。因为宋体-PUA并收录有扩展A区的字符。

不过,如果用宋体-PUA,这个帖子中的字符则应该全部能够正常显示的了,你不妨试试:http://bbs.unispim.com/viewthread.php?tid=9663&page=1&fromuid=43337#pid64809

-----------------------------------
我也是用宋体-PUA后才可以正常显示全部,如果用楼主说的宋体-18030的话还是不能正常显示。

XPSP3,没有装雅黑。
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
11楼#
发布于:2010-08-10 22:31
kmc:我测试的时候,即使给Firefox加了字体链接(方正兰亭黑_GB18030),依然无法正常显示紫光论坛上的字符(例如那个帖子6楼的字符)。


紫光论坛的讨论已经提到了,他们网页的编码不识别为GB18030,而是x-gbk,切换到GB18030后则可以正常显示。

而本论坛是UTF-8,上面引用部分可以正常显示,不过依然要正确设置字体链接,否则将是四个数字的Unicode方块。

Firefox的字体链接设置完毕后立即生效,不但不用重启,连刷新都不用,about:config设置好,切换回标签页就已经看到效果了。
回到原帖

嗯,是的,刚才我也发现about:config的设置是即时生效的,重启是多余之举。

至于紫光论坛6楼的那些汉字,是因为那几个字体在发帖的时候因为编码原因而变成了乱码了(显示成黑呼呼的中间带个问号的菱形),6楼的汉字是我用IE发帖的,IE在那个网页中用的编码为GB2312。而火狐浏览该网页的编码则是GBK。此外,紫光论坛也有人,由于火狐是基于WIN和LINUX全平台开发的,这点跟IE不一样,因此可能两者对于GBK或者GB2312编码的解析会有所不同。而那几个字符可能恰好就位于FF和IE解析有异的编码段,因而在火狐看就成了乱码了。

也有可能GBK跟GB2312是有一些编码不兼容的,因而造成乱码了。所以只要手动把网页编码改为GB2312或者是跟GB2312完全兼容的GB18030,那么那些乱码汉字就会正常显示的了。

而紫光论坛12楼的汉字,则是我用火狐浏览器用GBK编码发出的,不存在编码问题。要正常显示它们,只要设置好“字体清单”就可以了。

当然,还是要感谢kmc你提供的那份PDF,帮了很大的忙,再次谢谢你
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
12楼#
发布于:2010-08-10 22:31
liuxb:谢谢楼主的分析
测试了下,和楼主的结果稍有不同
==========
结果令人鼓舞,所有原来变成方框的字符都顺利显示了,不再需要专门跑去“工具-选项”里改字体了。
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里也不再以雅黑字体示人了,改以我设定的宋体-18030字体示人了。
==========
我这里是
原来变成方框的字符都顺利显示了,字体用的是宋体-pua.
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里仍然是用的雅黑显示的.

似乎雅黑的优先级要高一些.
系统是win7 32位 英文版
回到原帖

你是在字体清单里面添加了宋体-PUA字体么?如果是这样的话,那么火狐应该还是会调用雅黑来显示扩展A区的字符。因为宋体-PUA并收录有扩展A区的字符。

不过,如果用宋体-PUA,这个帖子中的字符则应该全部能够正常显示的了,你不妨试试:http://bbs.unispim.com/viewthread.php?tid=9663&page=1&fromuid=43337#pid64809
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
13楼#
发布于:2010-08-10 22:31
火狐字体链接的机理大致是搞懂了,火狐的字体链接,我就是用到about:config里面的“字体清单”来实现的吧

不过仍有一些疑问是没搞懂的:
在原来的设置中,在我没加上宋体-18030的时候。为何遇到一些CJK扩展A区的汉字时,火狐会调用雅黑来显示呢?在“字体清单”中并没有找到雅黑体啊。

所以我认为,火狐调用雅黑体来显示字符的机理,并不是由about:config里面的字体清单起作用的,应该是有更底层的机理在“作怪”。我推测是,这套机理是在about:config的字体清单的字体都无法正常显示字符时,才发挥“最后补救”作用的。它是火狐在字体显示上的最后补救措施,火狐把雅黑体作为汉字显示的“最后保险字体”。这可能已经由火狐的最底层代码设定好了,用户或许无法对此做出更改了。
所以如果仅仅从浏览器角度来看,不算上修改网页的CSS,用户能够对字体做出干预的最后一道设定应该就是about:config里面的“字体清单”了

或许是由于宋体-18030已经能够显示扩展A区的字符了,所以火狐的字体调用就停在了about:config的字体清单层面,而无必要更深一层去调用雅黑体。而之前由于我并没有加上宋体-18030这种支持扩展A区显示的字体,火狐在字体清单层面上依然未能正常显示那些A区字符,就唯有出动“撒手锏”,调用最后“手段”雅黑体来显示了。

当然,上述也仅仅是我的猜想。为了验证一下,我就做了一个试验:
我把about:config里所有有关中文项的(内地、香港、台湾)字体清单:
font.name-list.monospace.zh-CH
font.name-list.monospace.zh-HK
font.name-list.monospace.zh-TW
font.name-list.sans-serif.zh-CN
font.name-list.sans-serif.zh-HK
font.name-list.sans-serif.zh-TW
font.name-list.serif.zh-CN
font.name-list.serif.zh-HK
font.name-list.serif.zh-TW
的值都清空了

同时,也在工具-选项中,把“简体中文”“繁体中文(台湾)”“繁体中文(香港)”的字体,不论等宽、衬线还是无衬线,都通通改成了英文字体Tahoma、Times New Roman和Arial。

这样的话,假若我上面的猜想成立的话,那么火狐在“工具-选项”和name-list中都找不到能够显示中文字符的字体的情况下,应该就会调用最底层的雅黑来显示中文字符了。换言之,我的页面里中文字符应该全都变成了以雅黑体示人。

但测试效果却令我困惑了(看附件截图):
是的,有部分字体都变成了用雅黑体显示了(应该是所有简体字都用了雅黑体来显示了),似乎我的猜想成立了。但是其余那些没有简化的传承字和繁体字,则用了另外一种字体示人,既非雅黑体,也非宋体,也不像细明体。反倒有点像是日本的一种字体。

这就奇怪了,怎么会这样呢?我的猜想似乎是猜对了一半(简体字),但另外那些字则无法解释。

对此,我推测有几个可能:
1.火狐的底层设定除了雅黑体之外,还有另外一种字体来做字符显示的“最后把关”
2.可能是name-list中其它字体的干扰,因为我只删除了内地、台湾、香港的字体清单信息,对于其它地方的,例如韩国和日本那些,并没有改动。会不会这些地区的字体清单所设定的字体,本身就包含一些中文字,能够显示那些非简体的中文呢?所以火狐对于非简体字就没有调用雅黑体了。
3.我的整个猜想本身就是错的,根本就不存在雅黑作最后把关这一机制。之所以最初会调用雅黑来显示扩展A区的汉字,完全是因为about:config中的其它参数设定使然,只是我没有发现罢了。所以当我把字体清单的值清空后,也不会全部用雅黑体显示,而只是继续根据其它参数设定,调用雅黑体和另外一些字体。如果是这样的话,通过about:config,就应该能够实现对火狐字体调用的“充分”控制,只要我们能够参透它就是了。

大家对上述现象有什么看法吗?
kmc
kmc
管理员
管理员
  • UID165
  • 注册日期2004-11-25
  • 最后登录2024-08-29
  • 发帖数9187
  • 经验398枚
  • 威望1点
  • 贡献值124点
  • 好评度41点
  • 忠实会员
  • 终身成就
  • 社区居民
14楼#
发布于:2010-08-10 22:31
我测试的时候,即使给Firefox加了字体链接(方正兰亭黑_GB18030),依然无法正常显示紫光论坛上的字符(例如那个帖子6楼的字符)。
䝼䞍⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓䴔䴕䴖䴗䴘䴙䶮郎凉秊裏隣兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩


紫光论坛的讨论已经提到了,他们网页的编码不识别为GB18030,而是x-gbk,切换到GB18030后则可以正常显示。

而本论坛是UTF-8,上面引用部分可以正常显示,不过依然要正确设置字体链接,否则将是四个数字的Unicode方块。

Firefox的字体链接设置完毕后立即生效,不但不用重启,连刷新都不用,about:config设置好,切换回标签页就已经看到效果了。
Waterfox Current和Firefox Nightly都用,逐渐走出XUL扩展依赖
上一页
游客

返回顶部