FlashPlayer 9 for Linux的发布对我们这些关心Flex的Linuxer来说实在是个大好消息,但是对于中国用户来说确有一个非常不舒服的缺陷,Linux版本的FlashPlayer 9的中文显示有问题。以下以我的Linux中文字体环境对FlashPlayer 9 for Linux的中文显示进行分析,并给出一些临时的解决方法。
我的Linux发行版为Ubuntu feisty 7.04,使用的中文字体为文泉驿位图字体,我的/etc/fonts/language-selector.conf文件中字体配置部分片段如下:
[xml] <alias> <family>serif</family> <prefer> <family>Bitstream Vera Serif</family> <family>WenQuanYi Bitmap Song</family> <family>DejaVu Serif</family> <family>AR PL ShanHeiSun Uni</family> <family>AR PL ZenKai Uni</family> </prefer> </alias>
以上配置下的中zh_CN.UTF-8语言下,Flash中的中文一片空白。
首先,以以前FlashPlayer7的经验,我现查看了下/usr/lib/flashplugin-nonfree/libflashplayer.so看flashPlayer 9是否和7一样也将中文字体写死了,所以因为找不到对应的中文字体所以不能显示:
[bash] strings /usr/lib/flashplugin-nonfree/libflashplayer.so | grep font strings /usr/lib/flashplugin-nonfree/libflashplayer.so | grep Font strings /usr/lib/flashplugin-nonfree/libflashplayer.so | grep 'AR PL'
查看输出结果,并没有绑定字体,看样子FlashPlayer9比7字体选择方面更智能了。
既然不是这个原因,那们是不是FlashPlayer没有加载文泉驿字体呢,OK,我们就来看看我们打开包含中文的SWF文件时,FlashPlayer过程中的字体加载过程,使用以下命令启动火狐:
[bash] strace firefox 2>&1 |grep font
然后打开一个包含中文字符的SWF文件,并查看终端屏幕的输出,我的机子最后部分如下:
[bash]
< open("/usr/lib/firefox/res/fonts/fontEncoding.properties", O_RDONLY|O_LARGEFILE) = 50
< open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_12pt.pcf", O_RDONLY) = 50
---
> open("/usr/lib/firefox/res/fonts/fontEncoding.properties", O_RDONLY|O_LARGEFILE) = 46
> open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_12pt.pcf", O_RDONLY) = 46
503,505c503,516
< open("/usr/lib/firefox/res/fonts/fontEncoding.properties", O_RDONLY|O_LARGEFILE) = 40
< open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_9pt.pcf", O_RDONLY) = 40
< open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_9ptb.pcf", O_RDONLY) = 40
---
> open("/usr/lib/firefox/res/fonts/fontEncoding.properties", O_RDONLY|O_LARGEFILE) = 42
> open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_9pt.pcf", O_RDONLY) = 42
> open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_9ptb.pcf", O_RDONLY) = 42
> open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_9pt.pcf", O_RDONLY) = 104
> open("/var/lib/defoma/fontconfig.d/B/Bitstream-Vera-Sans.ttf", O_RDONLY) = 42
> read(119, " /var/cache/fontconfig/bf1f9632"..., 1024) = 1024
> open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_11pt.pcf", O_RDONLY) = 84
> open("/var/lib/defoma/fontconfig.d/V/Verdana-Bold.ttf", O_RDONLY) = 84
> open("/var/lib/defoma/fontconfig.d/V/Verdana-Regular.ttf", O_RDONLY) = 42
> open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_11pt.pcf", O_RDONLY) = 42
> open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_11pt.pcf", O_RDONLY) = 42
> open("/var/lib/defoma/fontconfig.d/V/Verdana-Bold.ttf", O_RDONLY) = 42
> open("/var/lib/defoma/fontconfig.d/V/Verdana-Regular.ttf", O_RDONLY) = 42
> open("/usr/share/fonts/wenquanyi/wqy-bitmapfont/wenquanyi_11pt.pcf", O_RDONLY) = 42
这说明,FlashPlayer正确识别了字体配置,也加载了正确的文泉驿字体。
大家应该知道文泉驿不是ttf矢量字体,而是位图字体,那们是不是FlashPlayer不支持位图字体呢,我们将/etc/fonts/language-selector.conf修改如下,使用SimSun替换文泉驿:
[xml] <alias> <family>serif</family> <prefer> <family>Bitstream Vera Serif</family> <family>SimSun</family> <family>DejaVu Serif</family> <family>AR PL ShanHeiSun Uni</family> <family>AR PL ZenKai Uni</family> </prefer> </alias>
重新启动,再次打开前面不能显示的SWF文件,一切显示正常。
OK,结论就是因为不支持位图字体所以不能正确显示了哦。下面我们来着手解决这个问题,我还没找到完美的解决办法,以下是一些临时的办法:
一、当然是在Linux中配置中文字体使用TTF字体就可以了,比如上面的使用SimSun
二、在Flex中使用CSS指定使用的设备字体,这样做的缺点是如果客户端没有你使用的字体,那们中文显示还是有问题,比如SimSun:
[xml]
<mx:Style>
global {
fontFamily: "SimSun";
}
</mx:Style>
三、使用嵌入字体的方式,这样做的好处是不管客户端是否有该中文字体,都可以正常显示,缺点是因为嵌入了中文字体会使SWF文件边的大很多,以下嵌入msyh.ttf字体:
[xml]
<mx:Style>
@font-face {
src:url("msyh.ttf");
fontFamily: msyhFont;
}
global {
fontSize:12;
fontFamily: "msyhFont;";
}
</mx:Style>
@font-face表示嵌入msyh.ttf,并将字体命名为msyhFont,global定义全局使用msyhFont字体。
以上只是一些临时的解决办法,我们会继续探寻完美的解决方法!顺祝大家春节愉快!
1 Comment at "FlashPlayer 9 for Linux中文显示问题的一些临时解决办法"
我用的arch,中文是缺字,而不是完全没有字,都不知道怎么搞才好。
Comment Now!