2

设想:

Flex 应用程序利用 @font-face 声明嵌入字体。(需要嵌入字体才能旋转文本。)

该应用程序最初是作为英文应用程序开发的,但在本地化过程中,需要找到能够显示亚洲字符的 unicode 字体。该应用程序的原始实现使用四种字体来满足字符强调的各种排列。Bold、Bold Italic、Italic 和 Normal 都是通过 Arial 系列中相应的 Arial 字体提供的。

问题:

当尝试将字体编译为可用于粗体、斜体和粗斜体的字体时(是的,它并不理想,这只是一个测试,看看是否可以完成):

@font-face { src:url("/fonts/ArialUnicode.ttf"); 
             fontFamily: myFamily;
             fontWeight: normal;
             fontStyle: normal;
             advancedAntiAliasing: true; }

@font-face { src:url("/fonts/ArialUnicode.ttf"); 
             fontFamily: myFamily;
             fontWeight: bold;
             fontStyle: normal;
             advancedAntiAliasing: true; }

etc.

问题是,在编译应用程序时,Flex 变得暴躁并给出以下错误消息:

[ERROR] /dirpath/Style.css:[49,-1] exception during transcoding: Font for alias 'myFont' with italic style was not found at: file:/dirpath/fonts/ArialUnicode.ttf

因此,通过一些调查确定,由于 Unicode 既不支持斜体也不支持粗体,因此当 Flex 编译器尝试嵌入字体时,它会变得不高兴,因为它无法在指定位置找到满足 css 要求的字体。

现在,当字体声明恢复为最简单的形式时:

@font-face { src:url("/fonts/ArialUnicode.ttf"); 
             fontFamily: myFamily;
             fontWeight: normal;
             fontStyle: normal;
             advancedAntiAliasing: true; }

一切编译正常,应用程序显示所有正常重量、正常样式的亚洲字符。但是,当在样式表中显示要以粗体或斜体显示的内容时,会出现一个框,表示没有嵌入字体,也没有任何系统字体可以在这些样式中呈现该字符。

现在这是变得奇怪的地方。

如果系统上安装了完全相同的 Unicode 字体,它将开始以粗体和斜体显示亚洲字符。这是没有意义的,因为当 Flex 尝试嵌入该字体以满足上述那些 css 样式时,字体中没有粗体和斜体字符。然而很明显,这种字体被用来显示粗体和斜体字符,就像在它作为系统字体安装之前它们只是框一样。这是某种 Flex 巫术吗?如果是这样,是否有某种方法可以以编程方式调用所述巫毒教,因为我不能依赖用户必须外出并在他们的系统上安装 unicode 字体。

编辑:这里有一些进一步的信息可以澄清这个问题。

我的问题实际上并不是我们如何为罗马字符设置多种字体和粗细,而是“Flex 如何将粗体和斜体应用于系统字体。当它说该字体在尝试嵌入时不支持这些字体时更是如此那个字体。”

使问题可重现的步骤如下:

  1. 仅将 MS Arial Unicode 嵌入到应用程序中并进行部署。
  2. 在新的 Windows 2003 机器上,打开 Firefox 并选择日语。
  3. 导航到应用程序 URL 并查看粗体和斜体应位于的框。
  4. 现在退出 Firefox。将 MS Arial Unicode 字体安装到 Windows 2003 系统中。
  5. 打开 Firefox 并重复。曾经是方框的区域现在是粗体/粗斜体/斜体日文字符。

这不是如何解决这个问题。有很多可行的解决方案。然而,我真正想知道的是 Flex 如何将粗体和斜体应用于它说不支持粗体或斜体的字体。

谢谢, C

4

1 回答 1

5

问题是您为所有四种字体变体指定了相同的文件名。单个 ArialUnicode.ttf 文件仅包含一个变体。

使用 c:\Windows\fonts 目录中的名称,您希望嵌入 arial.ttf、arialbd.ttf、arialbi.ttf 和 ariali.ttf。这些分别是正常、粗体、粗斜体和斜体变体。

请注意,从技术角度和法律角度来看,并非所有字体都可以自由嵌入。

法律方面是字体是软件,因此需要像您在程序中包含的任何其他第三方代码一样获得许可。您可能想查看Bitstream Vera字体系列,因为它们是自由许可的。该系列功能强大,旨在用作 Linux 等中的核心字体。

技术方面是这些规则被嵌入到 TTF 和 OTF 文件格式中,并且像 Flex 编译器这样的工具遵守文件中声明的许可限制。如果字体被标记为“不嵌入”,它不会让你嵌入它。

于 2010-04-27T13:44:18.477 回答