xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
阅读:12422回复: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来“补救”,而不是调用雅黑体呢?

我已经被这个问题困扰了很久了,一直摸索不了答案,所以就唯有上论坛来求救了。希望各位指点一下迷津吧,谢谢了
alanfly
千年狐狸
千年狐狸
  • UID31035
  • 注册日期2009-11-10
  • 最后登录2024-05-02
  • 发帖数2766
  • 经验577枚
  • 威望1点
  • 贡献值128点
  • 好评度99点
  • 社区居民
  • 最爱沙发
  • 忠实会员
1楼#
发布于:2010-08-10 22:31
firefox可以用css定义字体链接的,比如{font-family:arial,宋体 !important;}  ,就是页面文字先调用arial显示,剩下的中文部分调用宋体显示。
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
2楼#
发布于:2010-08-10 22:31
alanfly:firefox可以用css定义字体链接的,比如{font-family:arial,宋体 !important;}  ,就是页面文字先调用arial显示,剩下的中文部分调用宋体显示。回到原帖

是的,我搜过过论坛的帖,发觉有不少人提到过CSS这东东

但我对这东西很陌生,有不少问题。
请问,CSS是适用于所有网页还是仅仅可以对设定的网页生效?
{font-family:arial,宋体 !important;},是实现了两级字体链接。但我如果想实现三级字体链接呢?例如,如果我想先调用Tahoma显示,剩下的中文用宋体,而仅余的少部分的扩展A区等等字符,则用宋体-18030显示。不知道CSS能不能够这样设置链接呢?
CSS应该从哪里修改呢?我不知道怎样进去修改CSS
CSS中关于字体的设置,跟“工具-选项”里面关于字体的设置,又是什么关系呢?哪个优先级大一点?不知道会不会出现冲突呢?
alanfly
千年狐狸
千年狐狸
  • UID31035
  • 注册日期2009-11-10
  • 最后登录2024-05-02
  • 发帖数2766
  • 经验577枚
  • 威望1点
  • 贡献值128点
  • 好评度99点
  • 社区居民
  • 最爱沙发
  • 忠实会员
3楼#
发布于:2010-08-10 22:31
请问,CSS是适用于所有网页还是仅仅可以对设定的网页生效?

可以在代码头部设定,加句代码就可以设定对某具体网页、某域名、某url开头的所有网页和所有网页起作用,也可以设定对firefox菜单、标签等字体起作用;
{font-family:arial,宋体 !important;},是实现了两级字体链接。但我如果想实现三级字体链接呢?例如,如果我想先调用Tahoma显示,剩下的中文用宋体,而仅余的少部分的扩展A区等等字符,则用宋体-18030显示。不知道CSS能不能够这样设置链接呢?

可以啊,好像级数没有限制的,照你的意思代码就是{font-family:tahoma,宋体 ,宋体-18030 !important;}  ,对所有网页起作用的完整代码是
@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document url-prefix("http"),url-prefix("ftp") 
{* {font-family:tahoma,宋体 ,宋体-18030 !important;}}

CSS应该从哪里修改呢?我不知道怎样进去修改CSS Crying or Very sad

可以将css代码放到配置文件夹下chrome目录的userchrome.css和usercontent.css里,前者定义浏览器样式,后者定义网页样式;或者可以使用Stylish扩展管理、修改和预览代码;
CSS中关于字体的设置,跟“工具-选项”里面关于字体的设置,又是什么关系呢?哪个优先级大一点?不知道会不会出现冲突呢?

css的优先级高,不会冲突,css的设置会覆盖选项中的设置,不过前提是你勾选了选项中的允许页面选择自己的字体这个选项,如果没勾选就以选项中的字体设置为准。
MilchFlasche
小狐狸
小狐狸
  • UID4304
  • 注册日期2005-03-22
  • 最后登录2005-04-18
  • 发帖数4
  • 经验10枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
4楼#
发布于:2010-08-10 22:31
強烈建議樓主及樓上的朋友研究下 about:config 頁中的 font.name.* 條目。Firefox 的字體鏈接機制實際上比起 IE 強了不知幾倍,只是需要設定。這機制從 Mozilla 時代一早就有哩。

不需要用到網頁層級的 CSS 的,一來別人的站點咱們也無從改起。
alanfly
千年狐狸
千年狐狸
  • UID31035
  • 注册日期2009-11-10
  • 最后登录2024-05-02
  • 发帖数2766
  • 经验577枚
  • 威望1点
  • 贡献值128点
  • 好评度99点
  • 社区居民
  • 最爱沙发
  • 忠实会员
5楼#
发布于:2010-08-10 22:31
MilchFlasche:強烈建議樓主及樓上的朋友研究下 about:config 頁中的 font.name.* 條目。Firefox 的字體鏈接機制實際上比起 IE 強了不知幾倍,只是需要設定。這機制從 Mozilla 時代一早就有哩。

不需要用到網頁層級的 CSS 的,一來別人的站點咱們也無從改起。
回到原帖

about:config里的设置我没试过,以前也不知道,一直用的css改,配合stylish改css直观、方便;另外只是改字体怎么会无从改起,就跟在选项里设置字体一样的效果,只不过功能强大些。
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
6楼#
发布于:2010-08-10 22:31
MilchFlasche:強烈建議樓主及樓上的朋友研究下 about:config 頁中的 font.name.* 條目。Firefox 的字體鏈接機制實際上比起 IE 強了不知幾倍,只是需要設定。這機制從 Mozilla 時代一早就有哩。

不需要用到網頁層級的 CSS 的,一來別人的站點咱們也無從改起。
回到原帖

我刚才进去了about:config看过,确实发现关于font的设置有很多很多,定制性很强,如果掌握的话应该能够实现很好的字体链接。
但问题就是:我到底该设置哪一项呢?
kmc
kmc
管理员
管理员
  • UID165
  • 注册日期2004-11-25
  • 最后登录2022-09-22
  • 发帖数9186
  • 经验397枚
  • 威望1点
  • 贡献值124点
  • 好评度41点
  • 忠实会员
  • 终身成就
  • 社区居民
7楼#
发布于:2010-08-10 22:31
还真的有可能通过 about:config 里面就给设置了

http://www.ccli.gov.hk/cim-images/pua_config.pdf

--

楼主举的例子,你在本论坛发的“”“”两字,和“㷫、㓥、㗎 ”三字,我Firefox可以正常显示,我在Firefox的字体设置是Myriad Pro。不过我是使用了极限丽黑Pro替换了Simsun,所以可能没有参考意义。用IE看也正常。

紫光拼音论坛用Firefox打开的确好多方块,用IE打开,似乎显示得很混乱,虽然没有方块,但那个“青头”显示不出来,空白出现在两个引号之间。我就不具体截图了。

我猜测Firefox用的是自己的字体链接机制,无论是 about:config ,还是CSS,都可以自己设置。而IE用的是注册表中的fontlink项目
\\\Registry\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink\
Waterfox Current和Firefox Nightly都用,逐渐走出XUL扩展依赖
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
8楼#
发布于:2010-08-10 22:31
超感谢楼上kmc、alanfly和MilchFlascheApostle的提点,我通过about:config里面的设置,成功解决了一楼中提到的字符显示问题了。

其中要特别感谢kmc提供的那份PDF指南,虽然里面全是英文,而由于本人英语蹩脚,实在无法完全读懂里面的意思,只能连猜带蒙地读出大概信息,该PDF文档是教人在各操作系统下如何令到火狐顺利显示“Private Use Area”(私人造字区?应该是指香港的那套扩展集)的字符。

但虽然只是大概读懂,却已经足够了。这份指南成了解决这个字符显示问题的突破口

我发现指南是对以下两个参数“动了手脚”
font.name-list.sans-serif.zh-TW
font.name-list.serif.zh-TW

这套指南应该是教授给台湾的火狐用户的,它在针对台湾网页的衬线和无衬线字体的“字体清单”上添加了两种能够支持显示香港扩展字集的字体,从而实现了对扩展集字符显示的支持。

有样学样,我如果要在浏览内地网页时顺利显示GBK PUA区域和CJK扩展A区的字符,则只需要在针对内地网页的衬线和无衬线字体的“字体清单”上添加支持显示GBK PUA区域和CJK扩展A区字符的字体即可。

内地网页的衬线和无衬线字体的“字体清单”就是以下两条参数:
font.name-list.sans-serif.zh-CN
font.name-list.serif.zh-CN

原来这两条参数(字体清单)的值里面,只有“MS Song”和“SimSun”两种字体,SimSun是指宋体,而MS Song是什么字体则不清楚了,我的XP SP3应该没有安装这字体吧。反正我估计MS Song和宋体都不能支持显示GBK PUA区域和CJK扩展A区的字符。我在两条清单后面添加上了“宋体-18030”。

宋体-18030是同时收录了GBK PUA区域和CJK扩展A区字符的字体,如果设置没有错,那么加上以后应该就可以正常显示上述字符了。

另外,为免有“漏网”,我顺带连等宽字体的“字体清单”(font.name-list.monospace.zh-CN)也加上宋体-18030了

好了,一切设置完成,重启火狐,然后打开测试网页
http://bbs.unispim.com/viewthread.php?t ... 7#pid64809

结果令人鼓舞,所有原来变成方框的字符都顺利显示了,不再需要专门跑去“工具-选项”里改字体了。
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里也不再以雅黑字体示人了,改以我设定的宋体-18030字体示人了。

    谢谢各位不吝指教啰
alanfly
千年狐狸
千年狐狸
  • UID31035
  • 注册日期2009-11-10
  • 最后登录2024-05-02
  • 发帖数2766
  • 经验577枚
  • 威望1点
  • 贡献值128点
  • 好评度99点
  • 社区居民
  • 最爱沙发
  • 忠实会员
9楼#
发布于:2010-08-10 22:31
感谢xiss_fowu分享,这下我也会about:config里的设置了;
提醒下:那个pdf是kmc给的,楼上打错了。
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
10楼#
发布于:2010-08-10 22:31
alanfly:感谢xiss_fowu分享,这下我也会about:config里的设置了;
提醒下:那个pdf是kmc给的,楼上打错了。
回到原帖

呵呵,是的,已经更正了。谢谢提醒
liuxb
非常火狐
非常火狐
  • UID26160
  • 注册日期2008-09-05
  • 最后登录2021-12-02
  • 发帖数659
  • 经验324枚
  • 威望0点
  • 贡献值184点
  • 好评度16点
11楼#
发布于:2010-08-10 22:31
谢谢楼主的分析
测试了下,和楼主的结果稍有不同
==========
结果令人鼓舞,所有原来变成方框的字符都顺利显示了,不再需要专门跑去“工具-选项”里改字体了。
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里也不再以雅黑字体示人了,改以我设定的宋体-18030字体示人了。
==========
我这里是
原来变成方框的字符都顺利显示了,字体用的是宋体-pua.
而CJK 扩展A区的字符,如“㷫”“㓥”这些,在火狐里仍然是用的雅黑显示的.

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


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

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

Firefox的字体链接设置完毕后立即生效,不但不用重启,连刷新都不用,about:config设置好,切换回标签页就已经看到效果了。
Waterfox Current和Firefox Nightly都用,逐渐走出XUL扩展依赖
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,就应该能够实现对火狐字体调用的“充分”控制,只要我们能够参透它就是了。

大家对上述现象有什么看法吗?
xiss_fowu
小狐狸
小狐狸
  • UID25390
  • 注册日期2008-07-12
  • 最后登录2013-11-02
  • 发帖数93
  • 经验11枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 社区居民
14楼#
发布于: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
上一页
游客

返回顶部