2010-04-27 48 views
2

場景:在Adobe Flex中,爲什麼嵌入式字體的行爲與系統中安裝的字體行爲不同

Flex應用程序利用@ font-face聲明嵌入字體。 (嵌入字體需要能夠旋轉文本。)

該應用程序最初是作爲英文應用程序開發的,但在本地化期間,找到能夠顯示亞洲字符的unicode字體變得非常必要。該應用程序的原始實現使用四種字體來滿足字符強調的各種排列。粗體,粗斜體,斜體和正常都通過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變得暴躁,並提供了以下錯誤信息:

​​

因此,經過一番調查後發現,由於Unicode既不支持斜體字也不支持粗體,因此當Flex編譯器試圖嵌入字體時,它會感到不快,因爲它無法在滿足css要求的指定位置找到字體。

現在,當字體面聲明帶回其最簡單的形式:

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

一切編譯罰款和應用程序顯示一切正常體重,正常風格亞洲字符罰款。但是,在樣式表中顯示要以粗體或斜體顯示的內容時,會出現一個框,表示沒有嵌入字體,也沒有可以呈現該字體的任何系統字體。

現在,這裏是它變得奇怪。

如果在系統上安裝完全相同的Unicode字體,它將開始以粗體和斜體顯示亞洲字符。這是沒有意義的,因爲當Flex試圖嵌入該字體以滿足上述CSS樣式時,Bold和Italic字符不在字體中。然而,顯然這種字體正在被用來顯示粗體和斜體字符,就像以前它們只是作爲系統字體安裝之前的盒子一樣。這是一種Flex伏都教嗎?如果是這樣的話,我可以通過編程的方式調用所說的voodoo,因爲我不能依賴用戶不得不出去並在他們的系統上安裝unicode字體。

編輯: 這裏有一些進一步的信息可以澄清問題。

我的問題不是真的如何爲羅馬字符做多個字體的面和權重,而是「Flex如何將粗體和斜體應用於系統字體,甚至當它說該字體不支持這些字體時當試圖嵌入該字體。「

使問題可再現的步驟是這樣的:

  1. 僅嵌入MS宋體的Unicode到應用和部署。
  2. 在新的Windows 2003機器上,打開Firefox並選擇日語。
  3. 導航到應用程序URL並查看粗體和斜體應該放在哪個框中。
  4. 現在退出Firefox。將MS Arial Unicode字體安裝到Windows 2003系統中。
  5. 打開Firefox並重復。過去是盒子的區域現在是粗體/粗體斜體/斜體日文字符。

這不是如此解決這個問題。有很多可行的解決方案。然而,我真正想知道的是,Flex如何將粗體和斜體應用於不支持粗體或斜體的字體。

感謝, Ç

+0

這與嵌入式編程沒有任何關係,但由於信譽不足而無法保留。 – 2010-04-27 13:20:27

+0

也許它是因斜體,粗體和窄組合的其他字體文件而變得困惑? – 2010-04-27 13:21:07

+0

感謝Lasse,我沒有在帖子中描述它,但我們實際上是根據瀏覽器如何識別自己來加載單獨的模塊。運行時應用程序唯一的嵌入字體是Unicode字體,因爲如果客戶端響應它是日文或中文區域設置,我們不會加載其他字體。 – 2010-04-27 14:37:14

回答

5

的問題是,你正在爲所有四個字體的變體指定相同的文件名。單個ArialUnicode.ttf文件只包含一個變體。

使用c:\​​ Windows \ fonts目錄中的名稱,要嵌入arial.ttf,arialbd.ttf,arialbi.ttf和ariali.ttf。這些分別是正常,粗體,粗斜體和斜體變體。

請注意,從技術角度和法律角度來看,並非所有字體都可以自由嵌入。

法律方面是字體是軟件,因此需要獲得許可,就像您在程序中包含的任何其他第三方代碼一樣。您可能需要查看Bitstream Vera字體系列,因爲它們是免費許可的。該系列功能非常強大,旨在用作Linux等核心字體。

技術方面是這些規則被烘焙成TTF和OTF文件格式,Flex編譯器等工具遵守文件中聲明的許可限制。如果字體標記爲「不嵌入」,則不會讓您嵌入它。

+0

有些程序還使用'假大膽'和'假斜體',他們在字體上做了一些奇怪的事情,使它看起來像是粗體或斜體 - 儘管它看起來不像大膽和斜體的正確大膽和斜體版本字體。 – quoo 2010-04-27 14:15:09

+0

謝謝沃倫, 我們正在調查的合法性,並已經研究了各種開源Unicode字體。然而,問題在於,Flex似乎正在採用Arial Unicode這樣的字體,並應用粗體和斜體轉換來顯示粗體和斜體。但是,只有在系統上安裝字體,而不是嵌入字體的情況下。這是我試圖確定如何複製的行爲。 – 2010-04-27 14:35:32

+1

我想你會發現,如果你從一個單獨的文件中嵌入字體的全部四種變體,你會得到你想要的行爲。請記住,從內部獲取的字體(例如MS Word)的視圖是字體實際工作方式的抽象。 Word說你已經安裝了「Arial」,並且可以讓它加粗或斜體,或者兩者兼而有之。現實情況是,有許多重量和樣式的組合,每個組合都存儲在一個單獨的文件中。 Flex字體嵌入是基於這種底層的現實,而不是您通常在最終用戶應用程序中看到的抽象。 – 2010-04-28 10:31:23

相關問題