2010-05-21 74 views
8

我正在开发一个Web服务,它使用用户选择的TTF字体使用PHP GD扩展呈现字符。PHP-GD:处理Unicode字符

这工作正常,在ASCII-土地,但有几个问题:

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

  2. 如果某些装饰字符包括在内,可以很好地渲染选定字体中的大部分字符并以Arial(或任何包含扩展字形的字体)渲染装饰字符。

似乎并不像PHP-GD支持查询字体元数据以充分了解字符是否可以呈现给定的字体。什么是将字体指标导入到PHP中的好方法?是否有可以转储为XML或其他可解析格式的命令行工具?

+0

只是让自己的Unicode字体。 – 2010-05-21 02:48:29

回答

0

我最终使用TTX实用程序来转储字体指标。然后我可以检查生成的.ttx文件并查看字符 - >字形映射。我手动完成了这项工作,但可以自动解析XML文件。

一个例子GNU Makefile文件从一组TrueType字体在同一目录下生成文件.ttx:

all: fontmetrics 

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

clean: 
    rm -f *.ttx 

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

PHP-Cairo根据Pango构建,fontconfig应该有足够的大脑在适当的时候进行字体替换。

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字符是平等的,那么你可以使用它。如果不是,那么你不能。