【问题标题】:Displaying special extended characters with PHP用 PHP 显示特殊的扩展字符
【发布时间】:2013-07-17 15:26:53
【问题描述】:

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

我的客户是一家铸造厂。他们的大多数字体都有扩展字符。要求是为每种字体上传 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...

【问题讨论】:

    标签: php special-characters fontforge


    【解决方案1】:

    终于明白了!

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

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

    【讨论】:

    • Fontforge 可以生成统一字体对象文件格式。 UFO 是一个目录,表示具有一个或多个字形层的字体数据。并且可能非常适合您的任务。 unifiedfontobject.org
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2013-06-06
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多