Php 有没有办法判断字体是否支持Imagick中的给定字符?

Php 有没有办法判断字体是否支持Imagick中的给定字符?,php,fonts,imagick,Php,Fonts,Imagick,我正在使用生成简单的徽标,这些徽标只是背景上的文本 我通常会循环浏览所有可用的字体,为用户提供每种字体的不同渲染选项(每种字体一张图像) 问题是,有些字体不支持ASCII字符(我认为它们是为特定语言设计的)。我猜一些支持ASCII字符的字体,在使用非ASCII字符时也会失败 无论如何,我最终得到的图像如下: 在Imagick中是否有一种编程方式来判断给定字体是否支持给定字符串中的所有字符? 这将帮助我过滤掉那些不支持用户输入的文本的字体,并避免显示任何像上面那样的垃圾图像。我不知道使用ima

我正在使用生成简单的徽标,这些徽标只是背景上的文本

我通常会循环浏览所有可用的字体,为用户提供每种字体的不同渲染选项(每种字体一张图像)

问题是,有些字体不支持ASCII字符(我认为它们是为特定语言设计的)。我猜一些支持ASCII字符的字体,在使用非ASCII字符时也会失败

无论如何,我最终得到的图像如下:

Imagick
中是否有一种编程方式来判断给定字体是否支持给定字符串中的所有字符?


这将帮助我过滤掉那些不支持用户输入的文本的字体,并避免显示任何像上面那样的垃圾图像。

我不知道使用imagemagik的方法,但您可以从这里使用php字体解析器库:

具体来说,您可以分析所需字符串中每个字母的字体,并检查返回值:

    $fonts = array("myfont.ttf");

    /**
     * For this test, we'll print the header information for the
     * loaded font, and try to find the letter "g".
     */
    $letter = "g";
    $json = false;
    while($json === false && count($fonts)>0) {
            $font = new OTTTFont(array_pop($fonts));
            echo "font header data:\n" . $font->toString() . "\n";
            $data = $font->get_glyph($letter);
            if($data!==false) {
                    $json = $data->toJSON(); }}

    if($json===false) { die("the letter '$letter' could not be found!"); }
    echo "glyph information for '$letter':\n" . $json;
以上代码来自字体分析器项目fonttest.php类:


在谷歌上搜索了一段时间后,它看起来有点可疑——似乎您必须直接解析字体文件,这并不是一件小事。@Pekka웃 我绝对不会这么做。。。也许除了Imagick还有其他库可以查询TTF字体,希望有人能对此有所帮助!从理论上讲,你可以画出一个不确定的角色,并将你感兴趣的角色与那个角色进行比较。如果它们与每像素像素匹配,则可能也不支持其他字符。如果您成功地实现了这一点,您可以自动构建缓存文件、映射字体和支持的字符。这可能不是你想要的,Pekka和Dave的建议似乎更合理。此外,如果不支持的字符被打印为问号,这可能会失败。@Mikk这是个好主意!我曾考虑过测量结果字符的宽度(例如使用
imagettfbbox()
),但这很容易出错。实际上比较结果要好得多。替换字符在Unicode标准中的代码点U+FFFD(矩形和/或问号符号)。所以你可以用它来比较。但是考虑到这一点,你不妨将A和B进行比较。如果它们是相同的,那么字体是无用的。