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

使用PHP imagettftext()将东亚字符呈现为正方形,php,unicode,fonts,Php,Unicode,Fonts,我正在尝试使用PHP imagettftext函数使用verdana文本渲染图像。但是,并非所有东亚字符都能正确呈现。我试着使用其他字体,如tahoma和Lucida Grande,但两者都不起作用。然而,Arial Unicode工作得非常完美 问题是我不想使用Arial作为我的字体。有没有办法用Verdana这样的字体渲染 不是unicode和/或字体专家;因此,对问题的解释将很有帮助。IIRC您的truetype字体必须包含unicode字符 您可以在windows中的字符映射工具中查看特

我正在尝试使用PHP imagettftext函数使用verdana文本渲染图像。但是,并非所有东亚字符都能正确呈现。我试着使用其他字体,如tahoma和Lucida Grande,但两者都不起作用。然而,Arial Unicode工作得非常完美

问题是我不想使用Arial作为我的字体。有没有办法用Verdana这样的字体渲染


不是unicode和/或字体专家;因此,对问题的解释将很有帮助。

IIRC您的truetype字体必须包含unicode字符


您可以在windows中的字符映射工具中查看特定字体的字符数。

IIRC您的truetype字体中必须包含unicode字符


您可以在windows中的字符映射工具中查看特定字体的字符数。

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

有一种类似Verdana的字体,包含一些CJK字符 — 特别是日本汉字。也许这足够涵盖你想做的事了?它名为Meiryo,随Windows Vista/7提供。你也可以得到它。然而,它是一个TrueType Collection.ttc文件,我不确定PHP/GD是否可以直接处理它;许多东亚字体都是.ttc文件,因为它们通常包含基于相同字形的比例字体和单空间字体


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

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

有一种类似Verdana的字体,包含一些CJK字符 — 特别是日本汉字。也许这足够涵盖你想做的事了?它名为Meiryo,随Windows Vista/7提供。你也可以得到它。然而,它是一个TrueType Collection.ttc文件,我不确定PHP/GD是否可以直接处理它;许多东亚字体都是.ttc文件,因为它们通常包含基于相同字形的比例字体和单空间字体


如果PHP无法处理.ttc,您可能需要使用字体编辑器或TrueType SDK ttsdk.zip中的简单“breakttc.exe”命令行工具将Meiryo比例字体转换为单独的.ttf文件,该工具神秘地从microsoft.com消失,但是使用谷歌很容易定位。

我以前用imagettftext直接使用东亚字体渲染过日语字符。有一些是随Windows打包的:simsun中文MS哥特式日语MS Mincho日语最后两个相当于日语文本的无衬线和衬线。我认为中国的也有两种风格。在我以前的php代码中,它使用扩展名为.ttc的字体文件,不知道为什么。也许TTF是定义,而实际的字体是TTC文件?那是很久以前的事了

无论如何,对于使用Arial等,在Windows上,至少它的工作方式是系统检测到西方Unicode范围之外的字符,并将自动切换到默认安装的亚洲字体之一来呈现这些字符。这导致一些用户使用汉字而不是日语,反之亦然,因为许多汉字共享相同的unicode范围,但根据使用的字体,可以选择中文stlye或日语样式

混合使用这两种字体看起来不太好。使用纯日文字体将以单间距字体呈现字母字符,这看起来不太好


如果所有其他操作都失败,您可以尝试将字符串拆分为单独的西部/东部字符范围子字符串,并在字符上循环测试unicode范围,然后使用适当的字体呈现每个部分。请记住,东方字体是单间距的,至少是中文/日文,我不知道韩文等等。

我以前用imagettftext直接使用东亚字体渲染过日文字符。有一些是随Windows打包的:simsun中文MS哥特式日语MS Mincho日语最后两个相当于日语文本的无衬线和衬线。我认为中国的也有两种风格。在我以前的php代码中,它使用扩展名为.ttc的字体文件,不知道为什么。也许TTF是定义,而实际的字体是TTC文件?那是很长的一段时间 去

无论如何,对于使用Arial等,在Windows上,至少它的工作方式是系统检测到西方Unicode范围之外的字符,并将自动切换到默认安装的亚洲字体之一来呈现这些字符。这导致一些用户使用汉字而不是日语,反之亦然,因为许多汉字共享相同的unicode范围,但根据使用的字体,可以选择中文stlye或日语样式

混合使用这两种字体看起来不太好。使用纯日文字体将以单间距字体呈现字母字符,这看起来不太好

如果所有其他操作都失败,您可以尝试将字符串拆分为单独的西部/东部字符范围子字符串,并在字符上循环测试unicode范围,然后使用适当的字体呈现每个部分。请记住,东方字体是单间距的,至少是中文/日文,我不知道韩文,等等