|
|
居然讨论的如此深入.
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跑程序狂慢的。
差点忘了,谢谢楼上的。^_^ |
|