使用PHP imagettftext()呈现为正方形的东亚字符

时间:2009-02-24 18:06:09

标签: php unicode fonts

我正在尝试使用PHP imagettftext函数使用verdana文本渲染图像。但是,所有东亚角色都没有正确呈现。我尝试使用其他字体,如tahoma和Lucida Grande,但都不起作用。但是,Arial Unicode可以很好地工作。

问题是我不想使用Arial作为我的字体。有什么方法可以使用像Verdana这样的字体进行渲染吗?

(不是unicode和/或字体专家;因此对问题的解释会有所帮助)

3 个答案:

答案 0 :(得分:3)

Verdana,Tahoma或Lucida Grande都不包含中文/日文/韩文字符,因此他们永远无法“正确”呈现它们。没有字体包含每个 Unicode代码点的字形,因此无论你选择哪一个,你最终都会在某些时候丢失字形。

一种类似Verdana的字体,包含一些CJK字符 - 特别是日本汉字。也许这足以涵盖你想要做的事情?它被称为Meiryo,随Windows Vista / 7一起提供。你也可以得到它here。但它是一个TrueType Collection(.ttc)文件,我不确定PHP / GD是否可以直接处理;许多东亚字体都是.ttc文件,因为它们通常包含基于相同字形的比例和等宽字体。

如果PHP无法处理.ttc,您可能需要使用字体编辑器或简单的'breakttc.exe'命令行将Meiryo比例字体转换为单独的.ttf文件来自TrueType SDK的工具(ttsdk.zip,神秘地从microsoft.com消失,但可以使用Google轻松定位)。

答案 1 :(得分:1)

IIRC你的truetype字体必须包含unicode字符。

您可以在Windows中的“字符映射”工具中查看某种字体有多少个字符。

答案 2 :(得分:0)

我之前使用 imagettftext 呈现日文字符,直接使用东亚字体。有一些与Windows一起打包:“simsun”(中文)“MS Gothic”(日文)“Mincho女士”(日文)最后两个相当于sans serif和serif for Japanese text。我认为中国人也有两种风格。在我的旧PHP代码中,它使用扩展名为“.ttc”的字体文件,不知道为什么。也许TTF是定义,实际字体是TTC文件? (很久以前)

无论如何,至于使用Arial等,在Windows上至少它的工作方式是系统检测“西方”Unicode范围之外的字符,并自动切换到一个默认安装的“亚洲”字体来渲染那些。这导致一些用户获得中文字符而不是日文,反之亦然,因为这些字符中的许多字符共享相同的unicode范围,但是根据使用的字体,你可以使用“中文”stlye或日文风格。

混合两种字体看起来不太好。使用纯粹的日语字体会以“等宽”字体呈现字母字符,这看起来不太好。

如果所有其他方法都失败了,您可以尝试将字符串拆分为单独的西/东字符范围子字符串(循环字符和​​测试unicode范围),然后使用适当的字体渲染每个部分。请记住,东方字体是等宽的(至少是中国/日本,我不知道韩国等)。