我正在使用用户选择的TTF字体开发一个使用PHP GD扩展名渲染字符的Web服务。
这在ASCII-land中运行良好,但存在一些问题:
要渲染的字符串以UTF-8形式出现。我想将用户可选字体列表限制为只能正确呈现字符串的字体,因为某些字体只有ASCII字符的字形,ISO 8601等。
在包含一些装饰字符的情况下,可以在所选字体中渲染大部分字符并在Arial中渲染装饰字符(或任何包含扩展字形的字体)。
似乎PHP-GD不支持充分查询字体元数据以确定字符是否可以以给定字体呈现。将字体指标变为PHP的好方法是什么?是否有可以以XML或其他可解析格式转储的命令行实用程序?
答案 0 :(得分:2)
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 $<