PHP-GD:处理Unicode字符

时间:2010-05-21 02:42:59

标签: php unicode fonts gd

我正在使用用户选择的TTF字体开发一个使用PHP GD扩展名渲染字符的Web服务。

这在ASCII-land中运行良好,但存在一些问题:

  1. 要渲染的字符串以UTF-8形式出现。我想将用户可选字体列表限制为只能正确呈现字符串的字体,因为某些字体只有ASCII字符的字形,ISO 8601等。

  2. 在包含一些装饰字符的情况下,可以在所选字体中渲染大部分字符并在Arial中渲染装饰字符(或任何包含扩展字形的字体)。

  3. 似乎PHP-GD不支持充分查询字体元数据以确定字符是否可以以给定字体呈现。将字体指标变为PHP的好方法是什么?是否有可以以XML或其他可解析格式转储的命令行实用程序?

4 个答案:

答案 0 :(得分:2)

针对Pango构建的

PHP-Cairo和fontconfig应该有足够的大脑在适当时进行字体替换。

答案 1 :(得分:1)

您可以尝试使用pdflib扩展名中的pdf_info_font()。很好的例子是:http://www.pdflib.com/pdflib-cookbook/fonts/font-metrics-info/php-font-metrics-info/

答案 2 :(得分:1)

如果您没有unicode字体,则需要尝试类似

的内容
 <?php 
$trans = new Latin1UTF8(); 

$mixed = "MIXED TEXT INPUT"; 

print "Original: ".$mixed; 
print "Latin1:   ".$trans->mixed_to_latin1($mixed); 
print "UTF-8:    ".$trans->mixed_to_utf8($mixed); 

class Latin1UTF8 { 

    private $latin1_to_utf8; 
    private $utf8_to_latin1; 
    public function __construct() { 
        for($i=32; $i<=255; $i++) { 
            $this->latin1_to_utf8[chr($i)] = utf8_encode(chr($i)); 
            $this->utf8_to_latin1[utf8_encode(chr($i))] = chr($i); 
        } 
    } 

    public function mixed_to_latin1($text) { 
        foreach( $this->utf8_to_latin1 as $key => $val ) { 
            $text = str_replace($key, $val, $text); 
        } 
        return $text; 
    } 

    public function mixed_to_utf8($text) { 
        return utf8_encode($this->mixed_to_latin1($text)); 
    } 
} 
?>

取自http://php.net/manual/en/function.utf8-decode.php

如果混合和utf-8字符相等,那么您可以使用它。如果没有,那么你就不能。

答案 3 :(得分:0)

我最终使用TTX实用程序来转储字体指标。然后我可以检查生成的.ttx文件并查看character-&gt;字形图。我是手动完成的,但可以自动解析XML文件。

一个示例GNU Makefile,它从同一目录中的一组TrueType字体生成.ttx文件:

all: fontmetrics

fontmetrics: $(patsubst %.ttf,%.ttx,$(wildcard *.ttf))
.PHONY: fontmetrics

clean:
    rm -f *.ttx

%.ttx: %.ttf
    ttx -t cmap $<