1

所以我已经为此工作了几个小时,我已经接近了,但我一直卡在这些特殊字符上。

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

我已经完成了所有这些,我注意到当我使用 fontforge 进行转换时,它会创建一个 .afm 文件,该文件似乎是一个 Adob​​e 文件。

经过一番戳戳后,这个 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 中的内容 - 它是我无法正确显示的 $n - 像“aogonek”这样的字符

我在元数据和标题、各种 ISO 格式等中尝试过 UTF-8...

4

1 回答 1

0

终于想通了!

我记得看到 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" />

在我看到之后,这是一个使用简单 HTML DOM 解析器并从行中回显 unicode 字符的问题。

于 2013-07-17T16:33:10.197 回答