编程语言
首页 > 编程语言> > php – 使用imagettftext()时,如何处理字体文件不支持的字符?

php – 使用imagettftext()时,如何处理字体文件不支持的字符?

作者:互联网

我在PHP GD库创建的图像中使用Verdana字体.

imagettftext($image, $fontSize, 0, 70, $y, $color, $font, $username );

大多数情况下,imagettftext非常适合字符串.
但是我的一些用户在名字中使用了奇怪的字符/符号.
所以,当我尝试将他们的名字打印到图像时.例如:

该用户使用ɦɪɲɣƙƨєʌɾ
符号.所以Verdana无法打印出来.

我用过这个:

$username=iconv('UTF-8', 'ASCII//TRANSLIT', $username);

输出是这样的:

(当前语言环境在英语和德语之间发生变化.因此,当前语言环境可能无法处理这些字符:ɦɪɲɣƙƨєʌɾ)

似乎无法在不编写非常大的str_replace()块的情况下将trans音译到h,ɲ到n.像this.

>所以我想知道是否可以检查字体(Verdana)是否可以显示这些符号.如果其中一个字符无法在字符串内显示,那么我可以将空字符串传递给imagettftext方法.我可以检查字体内支持的字符吗?或者创建一个包含Verdana支持的符号的字符映射,并检查我的字符串是否包含不支持的符号?
(我认为由于this question不可能)
>或者也许是另一种解决方案,是否可以在imagettftext()中使用多种字体?
例如,首先尝试Verdana,如果Verdana没有涵盖那些符号使用Arial sans serif等.
>或任何其他解决方案?

编辑:
似乎Verdana在我的文本中不支持这些unicode字符.
Verdana支持角色:http://www.fileformat.info/info/unicode/font/verdana/grid.htm
Verdana不支持的字符:http://www.fileformat.info/info/unicode/font/verdana/missing.htm

解决方法:

我的第一选择是切换到支持您希望能够处理的全部字符的字体.但是不要指望单个字体会实现million-or-so possible characters in UTF-8.

现在,如果你想采用(懒惰)音译路线,我将参考this answer from Kemal Dağ

> PHP> = 5.4:使用新的内置Transliterator
> PHP< 5.4:使用his excellent port

我现在手头没有v5.4所以我无法讲述Transliterator,但KemalDağ的JTransliteration端口表现相当不错:

<?php
    require 'transliteration/JTransliteration.php';

    $input = 'ɦɪɲɣƙƨєʌɾ';
    echo JTransliteration::transliterate($input); // output: hIngk2ie^r

    $input = 'Хეλлఒ Wओრলद';
    echo JTransliteration::transliterate($input);

最后,如果你想检查给定的字体是否支持给定的字符,它会变得更加毛茸茸. This library将会有很大帮助.它需要> = 5.3(使用命名空间):

<?php
    $fontFile = 'arial.ttf';
    $charToCheck = 'ɣ';

    require_once 'php-font-lib-master/src/FontLib/Autoloader.php';

    use FontLib\Font;
    use FontLib\TrueType\Collection;


    $font = Font::load($fontFile);
    if ($font instanceof Collection) {
        $font = $font->getFont(0);
    }
    $subtable = null;
    foreach($font->getData("cmap", "subtables") as $_subtable) {
        if ($_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) {
            $subtable = $_subtable;
            break;
        }
    }

    if (isset($subtable["glyphIndexArray"][ord_utf8($charToCheck)])) {
        $supported = 'Supported';
    } else {
        $supported = 'Not Supported';
    }

    echo "$charToCheck is $supported by font $fontFile";


    function ord_utf8($c) {
        $b0 = ord($c[0]);
        if ( $b0 < 0x10 ) {
            return $b0;
        }
        $b1 = ord($c[1]);
        if ( $b0 < 0xE0 ) {
            return (($b0 & 0x1F) << 6) + ($b1 & 0x3F);
        }
        return (($b0 & 0x0F) << 12) + (($b1 & 0x3F) << 6) + (ord($c[2]) & 0x3F);
    }

来自font_info.php和R. Hill的ord_utf8()的无耻掠夺代码

附:字符串“ɦɪɲɣƙƨєʌɾ”由国际音标字符组成.我不确定任何语言环境是否支持这些字符(因为它没有实际需要,因为它们不被任何真正的人类语言使用).

标签:php,fonts,utf-8,gd,imagettftext
来源: https://codeday.me/bug/20190517/1120216.html