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字体。

以上只是一些临时的解决办法,我们会继续探寻完美的解决方法!顺祝大家春节愉快!