2009-02-24 104 views
1

我正在嘗試使用PHP imagettftext函數呈現帶有verdana文本的圖像。但是,所有東亞字符都沒有被正確渲染。我嘗試過使用其他字體,如tahoma和Lucida Grande,但都不起作用。然而,Arial Unicode完美地工作。使用PHP呈現爲正方形的東亞字符imagettftext()

問題是我不想使用Arial作爲我的字體。有什麼方法可以使用像Verdana這樣的字體進行渲染?

(非Unicode編碼的和/或字體專家,所以這個問題的解釋將是有益的)

回答

3

沒有Verdana,Tahoma或Lucida Grande包含中文/日文/韓文字符,因此他們將永遠無法呈現它們「正確」。沒有字體包含的字形,每 Unicode代碼點,所以無論你選擇什麼,你最終都會在某個點丟失字形。

There is一種類似於Verdana的字體,它包含一些CJK字符 - 特別是日文漢字。也許這足以涵蓋你想要做的事情?它被稱爲Meiryo並附帶Windows Vista/7。你也可以得到它here。但它是一個TrueType集合(.ttc)文件,我不確定PHP/GD是否可以直接處理;很多東亞字體都是.ttc文件,因爲它們通常包含基於相同字形形狀的比例和等寬字體。

如果PHP無法應對.ttc,則可能需要使用字體編輯器或簡單的'breakttc.exe'命令將Meiryo-proportional字體轉換爲單獨的.ttf文件, (ttsdk.zip,神祕地從microsoft.com消失,但使用Google可輕鬆定位)。

1

IIRC您的TrueType字體必須在它有Unicode字符。

您可以在窗口中的字符映射工具中看到特定字體有多少個字符。

0

以前,通過直接使用東亞字體渲染日文字符imagettftext。有哪個來包裝與Windows幾個:「宋體」(中國)「MS哥特」(日語)「明朝小姐」(日文),最後兩個是SANS相當於serif與襯線的日本文字。我認爲中國人也有兩種風格。在我的舊php代碼中,它使用帶有「.ttc」擴展名的字體文件,但不知道爲什麼。也許TTF是定義,實際字體是TTC文件? (很久以前)

無論如何,至少在Windows上使用Arial等,它的工作方式是系統檢測到「西部」Unicode範圍之外的字符,並且會自動切換到其中一個默認值安裝了「亞洲」字體來渲染這些字體。除其他事項外Thise原因,一些用戶獲得中國字符,而不是日本的,反之亦然,因爲很多這些字符的共享相同的Unicode範圍,但根據其字體使用上,你EGT「中國」 stlye或日本風格。

混合這兩種字體看起來不太好。純粹使用日文字體會將字母字符呈現爲「等寬字體」,這看起來不太好。

如果一切都失敗了,你可以嘗試分裂您的字符串爲單獨西方/東方字符範圍子(環上的字符和測試的unicode範圍),然後渲染適當的字體各部分。請記住東部字體是等寬的(至少中文/日文,我不知道韓文等)。