LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1666|回复: 2

转帖-form opera Forums 请教linux版的字体问题

[复制链接]
发表于 2006-4-22 10:41:39 | 显示全部楼层 |阅读模式
居然讨论的如此深入.

hursday, 30. March 2006, 01:51:29

bbr322

Registered: Mar 2006

Posts: 15
请教linux版的字体问题
在config中enable xft和disable core font,并且在international fonts中设置好中文字体,这时gbk/gb2312的网页显示非常不错,但utf8的中文网页仍然十分糟糕。翻了一些贴子并且进行了一些测试后,我对opera的字体选择机制越来越感到困惑了。
虽然enable了xft,但在字体选择的列表中却找不到sans、serif等字族,也就是说无法使用xft的字体替换机制。但我在增减了系统内的字体,然后fc-cache之后,opera所显示的utf8页面的字体会有所变化。这证明opera的确在使用xft来描绘字体,但我却没办法控制opera在显示utf8页面是采用的字体。
请问opera中的字体选择究竟是怎么样的,有没有办法让opera使用xft的sans字体?虽然有贴子建议把opera中的所有字体都设置为simsun,可这样英文字体就没法看了,难道非这样不可么?
谢谢~

Permalink
Friday, 31. March 2006, 17:33:10

FrankHill

Registered: Mar 2006

Posts: 10
是个问题,我觉得和系统也有一定关系。
还有汉字的描绘,大字体经常重叠在一起。
现在要求不高,对opera的定制也趋缓了。

Permalink
Sunday, 2. April 2006, 11:29:26

bbr322

Registered: Mar 2006

Posts: 15
这和系统应该没有多少关系,运行qtconfig,是可以看到sans和serif等字族的。除了opera,其他qt和kde程序也都表现正常。
记得以前看到贴子说,opera在linux下的字体表现要靠点运气,莫非所谓的运气就是看opera选到了哪一个中文字体……

Permalink
Sunday, 2. April 2006, 13:45:56

musiccow



Registered: Jul 2004

Location: Wuhan, China

Posts: 1606
我记得不清楚,Opera调用字体的顺序跟一般程序不太一样,建议用文泉驿的字体吧,中文英文都还耐看

Permalink
Sunday, 2. April 2006, 19:11:15

bbr322

Registered: Mar 2006

Posts: 15
wqy毕竟是点阵字体,对于终端、编辑器一类字号相对固定的程序还好,拿来作浏览器的字体实在不太适合。我觉得这虽然是opera的问题,但未必没有解决的办法,应该是还没找到才对,所以才发贴问的。

Permalink
Monday, 3. April 2006, 03:02:07

dragchan

Registered: Oct 2004

Posts: 16
sans、serif等字体是Qt预设的,跟fontconfig的设置没有什么关系。删除/etc/fonts/fonts.conf文件中sans、serif相关的字体替代项,打开qtconfig,仍然可以发现sans、serif。而且Qt中sans、serif等预设字体是最近的更新版本中才加入的。

不清楚opera是compile时使用的Qt版本不是最新的(Qt 3.3.6),还是opera根本没有采用Qt的字体匹配机制,而是自己实现。在opera中,除了menu外,字体替代机制时常给用户奇怪的感觉。

楼主想要opera在linux中比较完美地显示中文,有一个比较简单的办法:系统中只保留一个CJK字体文件(最好是SimSun),在opera的字体选项中设置你喜欢的英文字体。

Permalink
Monday, 3. April 2006, 03:43:41

musiccow



Registered: Jul 2004

Location: Wuhan, China

Posts: 1606
在linux下用windows的商业字体,面子上有点过不去哦~~~
大家都去文泉驿帮忙吧~~~~
http://www.wenq.org

Permalink
Monday, 3. April 2006, 11:00:44

bbr322

Registered: Mar 2006

Posts: 15
sans是无衬线字体,serif则是衬线字体,两者都是英文字体的一种分类。fontconfig中的确有这两种预设字族(还有mono,等宽字体),删掉fonts.conf里的设置这几种字族仍然可以用。
gtk和qt应该都是调用fontconfig去选择字体,具体的描绘工作则交由xft调用freetype来完成。我能确定现在的gtk和qt都使用了fontconfig,但上层库(gtk、qt)及具体程序也可以不理会fontconfig的设置,自己定义sans和serif的替换顺序。
目前我还不太确定,qt是否有一套自己的字体替换机制,用户能不能进行控制,有空我会去找找资料看看。我还是比较怀疑这是opera的问题,希望是我错了吧。;p
我用的opera是weekly的share版本,所以用到的qt肯定是我系统上的3.3.6。只留一个中文字体的确有可能是个解决的办法,可大概只有opera的狂fan会这么做吧。。

ps:单纯讨论问题,不要牵涉“意识形态”问题比较好。

Permalink
Monday, 3. April 2006, 11:24:36

musiccow



Registered: Jul 2004

Location: Wuhan, China

Posts: 1606
大牛以后要常来啊,千万别让这个人才从社区流失掉了。

Permalink
Tuesday, 4. April 2006, 01:29:27

dragchan

Registered: Oct 2004

Posts: 16
Qt早期版本的字体替代机制,完全不理会fontconfig的设置,其处理发式和现在opera差不多--如果所指定的字体(如Arial)不包含要显示的字符(如中文),则会在系统的所有字体中寻找包含显示字符的替代字体,其查找的循序,似乎是按照字体名字排序的先后。最近的Qt版本,则会参考fontconfig的设置。


opera应该是自己实现字体替代机制,其方式和上述相似。由于最新版本的xft/fontconfig/freetype支持一个字体有多个字体名,缺省返回的字体名由当前的locale决定,这更增加了opera究竟选择那个替代字体的复杂性。举个例子:opera的字体选项中配置的都是Arail,系统中有两个中文字体AR PL ShanHeiSun Uni(文鼎PL细上海宋Uni)、AR PL ZenKai Uni(文鼎PL中楷Uni)。在locale是en_US时,按照字体名排序,opera选择的替代字体是AR PL ShanHeiSun Uni;而locale是zh_CN时,xft/fontconfig缺省返回的是utf8编码的 文鼎PL细上海宋Uni、文鼎PL中楷Uni,此时,按照字体名排序,opera选择的是 文鼎PL中楷Uni。


希望opera也采取Qt的做法,在实现字体替代时参考fontconfg的设置,让用户有更多的选择权。

Permalink
Tuesday, 4. April 2006, 01:52:34

musiccow



Registered: Jul 2004

Location: Wuhan, China

Posts: 1606
恩,等我论文翻译完了,就去英文区发个帖子wish一下

Permalink
Tuesday, 4. April 2006, 09:46:00

bbr322

Registered: Mar 2006

Posts: 15

Originally posted by dragchan:
Qt早期版本的字体替代机制,完全不理会fontconfig的设置,其处理发式和现在opera差不多--如果所指定的字体(如Arial)不包含要显示的字符(如中文),则会在系统的所有字体中寻找包含显示字符的替代字体,其查找的循序,似乎是按照字体名字排序的先后。最近的Qt版本,则会参考fontconfig的设置。


看起来很复杂的样子。我的系统上fontconfig返回的第一个英文字体是Bitstream Vera Sans,中文则是SimSun。如果opera只是在当前字体中找不到,就调用fontconfig去找下一个,那表现应该也正常才对,但我这里opera显示utf8页面使用的字体却是AR PL ShanHeiSun Uni。如果是按照字体的中文名排序,“文鼎”应该是在“宋体”之后的,所以真的是按排序后的顺序调用的话,应该也是字体的英文名才对。
如果opera不提供用户控制手段的话,看来只有想其他的办法解决了。譬如说在user.css中构建规则?不过opera我没那么熟,这个我恐怕没办法试,不知是否可行?

Permalink
Tuesday, 4. April 2006, 11:04:17

tytyty



Registered: Mar 2006

Posts: 60
参考此帖,好像是用simsun替换AR PL等字体,我试了一下,果然好使,UTF-8的网页都用宋体显示。
http://my.opera.com/chinese/forums/topic.dml?id=124577

Permalink
Tuesday, 4. April 2006, 11:07:03

mingfal



Registered: Oct 2005

Location: Jinan,China

Posts: 22
对,opera在linux的替换顺序有点问题,不是按照fonts.conf里面设置的,而是字典序。

Permalink
Tuesday, 4. April 2006, 15:16:50

bbr322

Registered: Mar 2006

Posts: 15

Originally posted by tytyty:
参考此帖,好像是用simsun替换AR PL等字体,我试了一下,果然好使,UTF-8的网页都用宋体显示。
http://my.opera.com/chinese/forums/topic.dml?id=124577


呵,linux下的字体配置虽然比前几年简单得多,但也没简单到这样的地步。
那位jerryjin或许对linux还不够了解,用simsun.ttc改名覆盖系统现存字体这一步其实并不需要,他所说字体发虚的问题也是可以解决的。

目前来看这个问题是无解了,唉。

Permalink
Wednesday, 5. April 2006, 02:19:40

dragchan

Registered: Oct 2004

Posts: 16

Originally posted by bbr322:
看起来很复杂的样子。我的系统上fontconfig返回的第一个英文字体是Bitstream Vera Sans,中文则是SimSun。如果opera只是在当前字体中找不到,就调用fontconfig去找下一个,那表现应该也正常才对,但我这里opera显示utf8页面使用的字体却是AR PL ShanHeiSun Uni。如果是按照字体的中文名排序,“文鼎”应该是在“宋体”之后的,所以真的是按排序后的顺序调用的话,应该也是字体的英文名才对。
如果opera不提供用户控制手段的话,看来只有想其他的办法解决了。譬如说在user.css中构建规则?不过opera我没那么熟,这个我恐怕没办法试,不知是否可行?


我机子上的opera,utf8和gbk/gb2312编码的网页没有区别,local为zh_CN时,在AR PL ShanHeiSun Uni和SimSun中选择SimSun作为替代字体。

改user.css也许是个可行的办法,但很难做到尽善尽美,还是期望opera修改自己的字体替代机制吧,这才是正道。

Permalink
Friday, 7. April 2006, 10:28:55

bbr322

Registered: Mar 2006

Posts: 15

Originally posted by dragchan:
我机子上的opera,utf8和gbk/gb2312编码的网页没有区别,local为zh_CN时,在AR PL ShanHeiSun Uni和SimSun中选择SimSun作为替代字体。


有点糊涂,前面的贴子你说你的机器上locale不同时opera所选的字体不同,这张贴子里又说选用的是simsun。若上面的讨论成立的话,opera不可能选到simsun作替换字体,请问可不可以把你的配置贴出来看看?

Permalink
Saturday, 8. April 2006, 05:58:44

dragchan

Registered: Oct 2004

Posts: 16

Originally posted by bbr322:

有点糊涂,前面的贴子你说你的机器上locale不同时opera所选的字体不同,这张贴子里又说选用的是simsun。若上面的讨论成立的话,opera不可能选到simsun作替换字体,请问可不可以把你的配置贴出来看看?


按照我上面的说法,在locale是en_US时,是按字体的英文名,此时opera选择的是AR PL ShanheiSun Uni;在locale是zh_CN时,是按字体的中文名(utf8编码),此时opera选择的是宋体(我在回帖中说选择的是SimSun,可能造成bbr322的误解)

至于配置文件,和字体相关的部分,我没有进行任何的设置。

Permalink
Saturday, 8. April 2006, 11:09:06

chwt

Registered: Jul 2005

Posts: 21
如果能装上sisun字体那是最好不过,没有也行,在opera字体设置那里,点击国际字体,右上角‘书写系统’选择简体中文,左下角‘普通字体’选择nsisun
试试看。

Permalink
Saturday, 8. April 2006, 22:10:39

bbr322

Registered: Mar 2006

Posts: 15

Originally posted by dragchan:

Originally posted by bbr322:

有点糊涂,前面的贴子你说你的机器上locale不同时opera所选的字体不同,这张贴子里又说选用的是simsun。若上面的讨论成立的话,opera不可能选到simsun作替换字体,请问可不可以把你的配置贴出来看看?


按照我上面的说法,在locale是en_US时,是按字体的英文名,此时opera选择的是AR PL ShanheiSun Uni;在locale是zh_CN时,是按字体的中文名(utf8编码),此时opera选择的是宋体(我在回帖中说选择的是SimSun,可能造成bbr322的误解)

至于配置文件,和字体相关的部分,我没有进行任何的设置。


请看我的贴图。最右边显示的是我测试时系统存在的中文字体,有文鼎的楷体和宋体,还有中易宋体,locale为zh_CN.utf8。左边两个窗口是linuxsir.cn的首页,最左边是原始页面,utf8编码,中间的是我改的gb2312编码。我已将国际字体中的简体中文设为simsun,中间的窗口显示正确,而左边的仔细一看就知道,显示字体是文鼎的宋体。
所以我仍不太清楚所谓误解是哪个部分。如果以英文字体名排序,AR PL ShanHeiSun Uni是在SimSun和NSimSun之前。如以utf8编码排序,“文”是0x5B8B,“宋”是0x6587,文鼎PL细上海宋Uni仍然排在前面。而你在前面的贴子中说,你的opera显示utf8页面和gbk页面并无区别,都是simsun,如果真是这样的话,那问题岂不就解决了,所以我才说请麻烦贴一下你的配置。

Permalink
Saturday, 8. April 2006, 22:13:22

bbr322

Registered: Mar 2006

Posts: 15
抱歉,第一次用,还不太习惯。


screenshot-20060409_0548.JPG

Permalink
Tuesday, 11. April 2006, 03:20:44, edited Tuesday, 11. April 2006, 08:51:54

dragchan

Registered: Oct 2004

Posts: 16

Originally posted by bbr322:

请看我的贴图。最右边显示的是我测试时系统存在的中文字体,有文鼎的楷体和宋体,还有中易宋体,locale为zh_CN.utf8。左边两个窗口是linuxsir.cn的首页,最左边是原始页面,utf8编码,中间的是我改的gb2312编码。我已将国际字体中的简体中文设为simsun,中间的窗口显示正确,而左边的仔细一看就知道,显示字体是文鼎的宋体。
所以我仍不太清楚所谓误解是哪个部分。如果以英文字体名排序,AR PL ShanHeiSun Uni是在SimSun和NSimSun之前。如以utf8编码排序,“文”是0x5B8B,“宋”是0x6587,文鼎PL细上海宋Uni仍然排在前面。而你在前面的贴子中说,你的opera显示utf8页面和gbk页面并无区别,都是simsun,如果真是这样的话,那问题岂不就解决了,所以我才说请麻烦贴一下你的配置。


替代字体的先后顺序,在配置opera字体的dialog中可以看到(utf8编码的字体名显示为乱码),在qtconfig中也可以看。locale为zh_CN时,我机子上的顺序是:宋体、文鼎PL中楷Uni、文鼎PL细上海宋Uni、新宋体。所以我在opera中没有进行字体的配置,浏览中文网页时,opera都选择“宋体”作为替代字体。

0x5B8B应该是“文”的GBK编码吧,utf8编码的中文字符,一般为3个byte。另外我觉得在比较字符的先后顺序时,程序一般不是简单的比较编码的大小,而是调用glibc的相关函数。LC_COLLATE就是用来指定比较string所用的locale的。不过在glibc的设置文件中,中文字符的先后顺序,不清楚是如何定义的,好像既不是按拼音,也不是按笔画(似乎就是简单的按字符相应编码的大小)。所以当目录中中文文件名很多时,在konqueror之类的程序中,定位某一个文件,是件很苦恼的事情。

更正一下:Qt中缺省的string比较是简单地按照其unicode编码的大小,除非调用特定的函数(按locale比较会影响效率)。具体到字体名的排序,应该是将xft/fontconfig返回的utf8编码的字体名转换成unicode后,统一转换成小写字符,简单地比较编码的大小。

Permalink
Tuesday, 11. April 2006, 03:40:53

kliz



Registered: May 2005

Location: china

Posts: 160
谨受教

Permalink
Tuesday, 11. April 2006, 14:50:57

blance2599

Registered: Mar 2006

Posts: 4
用默认字体就很完美了
具体:修改~/.opera/opera6.ini
在[User Prefs]这栏里面加上
Enable Core X Fonts=0
Enable Xft Fonts=1

Permalink
Tuesday, 11. April 2006, 18:37:42

bbr322

Registered: Mar 2006

Posts: 15
这个地方是我搞错了,但0x5b8b也不是“文”的gbk编码,是“宋”的utf-16be编码。可以用如下命令验证:
echo 宋 | iconv -f utf8 -t utf16be | xxd
unicode的排序问题我记得不太清楚了,印象中是按照笔画来排的。因为unicode涉及各国文字,大陆的标准读音并不能被日本台湾的用户所接受。而且读音又涉及一个标准问题,不但费时耗力,学界对于某些字的读音会也会有所分歧。说是可以把LC_COLLATE设置成zh_CN.gbk之类的来采用拼音排序,但我以前试过好像问题很多,也就放弃了。

扯远了一点。如果按照utf-16be排序的话,宋体的确在文鼎之前。这样问题就有趣了,我这边是zh_CN.utf8,opera选的是文鼎。你那边也是zh_CN.utf8,但选的却是宋体。我觉得你的系统蛮值得研究一下的,不知道愿不愿意奉献一下?就是有可能把你的字体也搞乱就是了。;p
先对一下基本系统。我的是archlinux,kernel 2.6.16,glibc 2.3.6,xorg 11R7.0,libxft 2.1.8.2,fontconfig 2.3.2,qt 3.3.6,opera-devel 20060331.5(9.00b206)。
locale是在xinitrc里设置的LANG=zh_CN.utf8,LC_COLLATE设置为zh_CN.utf8或C都不影响最终效果。
qtconfig没动过(删掉~/.qt后再启动opera)。

Permalink
Wednesday, 12. April 2006, 05:05:13

dragchan

Registered: Oct 2004

Posts: 16

Originally posted by bbr322:

unicode的排序问题我记得不太清楚了,印象中是按照笔画来排的。因为unicode涉及各国文字,大陆的标准读音并不能被日本台湾的用户所接受。而且读音又涉及一个标准问题,不但费时耗力,学界对于某些字的读音会也会有所分歧。说是可以把LC_COLLATE设置成zh_CN.gbk之类的来采用拼音排序,但我以前试过好像问题很多,也就放弃了。


不同的国家或地区(大陆、台湾、日本等),可以定义不同的排序,可以参考/usr/share/i18n/locales/下的文件。更改对应的文件后,运行localedef(应该是?)。目前似乎只有日本对应的文件定义了自己的排序,zh_CN、zh_TW等都是引用缺省的定义。



Originally posted by bbr322:

扯远了一点。如果按照utf-16be排序的话,宋体的确在文鼎之前。这样问题就有趣了,我这边是zh_CN.utf8,opera选的是文鼎。你那边也是zh_CN.utf8,但选的却是宋体。我觉得你的系统蛮值得研究一下的,不知道愿不愿意奉献一下?就是有可能把你的字体也搞乱就是了。;p
先对一下基本系统。我的是archlinux,kernel 2.6.16,glibc 2.3.6,xorg 11R7.0,libxft 2.1.8.2,fontconfig 2.3.2,qt 3.3.6,opera-devel 20060331.5(9.00b206)。
locale是在xinitrc里设置的LANG=zh_CN.utf8,LC_COLLATE设置为zh_CN.utf8或C都不影响最终效果。
qtconfig没动过(删掉~/.qt后再启动opera)。


你先确定一下,qtconfig中选择字体的combo box中所列的字体顺序。我的系统跟你参不多,不同的是qt 3.3.6是自己compile的。最近刚刚升级到Fedora 5(之前一直用RedHat 7.2),自带的Qt patch了qt-immodule,导致下载的share版本的opera、skype等软件无法输入中文,所以重新compile qt source。



Permalink
Friday, 14. April 2006, 18:38:20

bbr322

Registered: Mar 2006

Posts: 15
非常不好意思,这几天饭局稍微多了点,没什么时间上来。
既然dragchan怀疑跟qt的字体设置有关,能不能麻烦把~/.qt下的qtrc贴出来一下?qt的字体信息似乎是保存在那个文件里的,qt的字体设置有好几个框,说明也写得有点晕。

Permalink
Saturday, 15. April 2006, 01:43:10

dragchan

Registered: Oct 2004

Posts: 16
qtrc并没有进行特殊的设置,我是指查看一下qtconfig在选择default font时,combo box中所列的字体顺序。

qtconfig.png

Permalink
Wednesday, 19. April 2006, 14:59:26

bbr322

Registered: Mar 2006

Posts: 15
没什么特别的啊,qtconfig中的字体顺序是ascii码排列的,simsun之类显示的是英文字体名,所以文鼎字体在最前面。

Permalink
Thursday, 20. April 2006, 02:57:30, edited Thursday, 20. April 2006, 03:21:24

dragchan

Registered: Oct 2004

Posts: 16
qtconfig2.png


另外,刚刚在使用opera时,偶然发现了问题的解决办法。opera在locale为zh_CN.utf8时,浏览utf8编码的网页,不参考国际字体选项的设置;但在locale是zh_CN.gbk(gb2312、gb18030)时,却会参考国际字体的设置。楼主可以更改当前的locale;如果不想改变系统的locale,可以修改opera的运行文件,它是一个shell script,在开头加入一句export LC_ALL=zh_CN.gbk即可。

Permalink
Friday, 21. April 2006, 19:32:16

bbr322

Registered: Mar 2006

Posts: 15
ft到死,还真是的呢,原来答案这么简单。真是有种退回zh_CN.gbk的冲动,用utf8好处没见着,麻烦一堆。。。
对于这种讨厌的locale问题,我也有个小tip。
在用户目录里建一个保存脚本的目录,例如~/bin。保证PATH环境变量中该目录在最前面,例如在~/.bashrc的最后一行里写:export PATH="~/bin{PATH}"。
在该目录建立同名脚本文件,例如opera:
#!/bin/sh
LANG=zh_CN.gbk /usr/bin/opera $@

这一招本来是为wine准备的,因为utf8下wine跑程序狂慢的。
差点忘了,谢谢楼上的。^_^
发表于 2006-4-22 19:56:34 | 显示全部楼层
嗯,我也发了个帖子问QT的字体处理问题。

KDE的表现和Opera还不太一样,在zh_CN.UTF-8的locale下,KDE毕竟能fall back on到一个中文字体上,应该是通过fontconfig取的。但Opera只要在UTF-8的locale下,系统安装有日韩字体,那么情况就很有趣了,比如在我的系统中,zh_CN.UTF-8的locale,Opera显示utf8编码的中文页面,如这个论坛,google等,就会用一个韩文字体gulim,而不是国际字体中简体中文中指定的那个,也不理会css。gulim只覆盖了不完整的unicode的CJK部分,但这时Opera会将缺字部分用一个中文字体替代,这样就出现了一个页面中中文部分由中韩两个字体显示的情况。

但Konqueror的情况又有不同,前面说了zh_CN.UTF-8的locale下,总是能找到一个固定的中文字体的,只不过不明白serif和sans-serif的归类,也不理会网页css中指定的中文字体,即使用SimSun这样的英文字体名字。但到了其它UTF-8的locale下,情况就和Opera差不多,而且韩文字体中缺的字体不会找中文字体补上。

据说新版的gulim字体new gulim覆盖了完整的unicode CJK部分和部分CJK ext-A,如果系统有那个字体,估计就会出现完全用韩文字体表现中文的情况了。

这个情况似乎在qt更新到3.3.6后才明显的,以前没注意。

qt的国际化处理机制到qt-4前大概不会有大变化了。难道要离开KDE一段时间了?

qtconfig往英文字体下一个个加替换列表是可以的,但麻烦,而且这样替换后,中文字体的人工加粗就消失了。
回复 支持 反对

使用道具 举报

发表于 2006-8-5 03:16:20 | 显示全部楼层
晕,这个贴子怎么到处都在转。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表