用PHP显示特殊的扩展字符


Displaying special extended characters with PHP

所以我已经为此工作了几个小时,我已经很接近了,但我一直被这些特殊的字符所困扰。

我的客户是一家打字厂。他们的大多数字体都有扩展字符。要求是每个字体上传1个OTF文件,将其转换为eot、woff等…然后允许下载和购买该字体。

我已经完成了所有这些,我注意到当我用fontforge进行转换时,它会创建一个.am文件,看起来是一个Adobe文件。

经过一些戳和戳,这个AFM文件包含字体中所有字符的列表。令人惊叹的

现在我正试图在页面中嵌入OTF文件,以显示它附带的所有字符,但我不知道该使用哪个字符编码。

我的AFM文件样本:

C 251 ; WX 965 ; N ucircumflex ; B 90 -10 869 691 ;
C 252 ; WX 965 ; N udieresis ; B 90 -10 869 675 ;
C 253 ; WX 856 ; N yacute ; B 11 -182 845 678 ;
C 254 ; WX 947 ; N thorn ; B 96 -172 899 668 ;
C 255 ; WX 856 ; N ydieresis ; B 11 -182 845 675 ;
C -1 ; WX 1090 ; N Amacron ; B 0 0 1090 820 ;
C -1 ; WX 927 ; N amacron ; B 65 0 861 655 ;
C -1 ; WX 1090 ; N Abreve ; B 0 0 1090 851 ;
C -1 ; WX 927 ; N abreve ; B 65 0 861 686 ;
C -1 ; WX 1090 ; N Aogonek ; B 0 -182 1090 668 ;
C -1 ; WX 927 ; N aogonek ; B 65 -182 861 496 ;
C -1 ; WX 1093 ; N Cacute ; B 63 -10 1040 843 ;
C -1 ; WX 917 ; N cacute ; B 48 -10 883 678 ;

以及我如何尝试用PHP 显示字符

if($row['afm'])
{
    $in = 0;
    $file_handle = fopen($row['afm'], "r");
    while (!feof($file_handle)) 
    {
        $line = fgets($file_handle);
        if(substr($line, 0, 16) == "StartCharMetrics")
        {
            $in = 1;
        }
        if(substr($line, 0, 14) == "EndCharMetrics")
        {
            $in = 0;
        }
        if($in == 1)
        {
            list($c, $wx, $n, $b) = explode(";", $line);
            list($a, $b) = explode(" ", trim($c));
            echo "<div class='box' style='font-family: sample; width: 150px; height: 50px; border: 1px #c4c4c4 solid; float: left; padding: 10px; font-family: sample; font-size: 44px;'>";
            //echo $b . "<br>";
            if($b == "-1")
            {
                list($nn, $nnn) = explode(" ", trim($n));
                //echo "<!ENTITY " . $nnn . " '&" . $nnn . ";>";
                echo unichr($nnn);
                //echo htmlspecialchars_decode("&" . $nnn . ";");
            }
            else
            {
                echo unichr($b);
            }
    //      echo $line . "<br>";
            echo "</div>";
        }
    }
    fclose($file_handle);
}
function unichr($u) {
    return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML_ENTITIES');
}

如果$c包含一个可识别的字符(即:不是-1),请使用它,否则,请使用$n中的whats-这是我无法正确显示的$n-字符,如"aogonek"

我已经尝试过在元和标头、各种ISO格式等中使用UTF-8。

终于想通了!

我记得看到fontforge还可以导出SVG文件。在wim上,我将OTF文件转换为SVG,并在文本编辑器中打开它——它的纯人类可读文本看起来像

<glyph glyph-name="ff" unicode="ff" horiz-adv-x="1001" 
d="M26 496h74v58c0 67 56 114 139 114h267v-131h-101c-25 0 -37 -13 -37 -41h85v-135h-85v-361h-268v361h-74v135zM512 496h74v58c0 67 56 114 139 114h267v-131h-101c-25 0 -37 -13 -37 -41h85v-135h-85v-361h-268v361h-74v135z" />

在我看到这一点之后,我需要使用SimpleHTMLDOMParser并从行中回显unicode字符。