代码之家  ›  专栏  ›  技术社区  ›  sehugg

php-gd:处理Unicode字符

  •  8
  • sehugg  · 技术社区  · 16 年前

    我正在开发一个Web服务,该服务使用php gd扩展,使用用户选择的ttf字体呈现字符。

    这在ascii的土地上很有效,但也有一些问题:

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

    2. 在包含某些装饰性字符的情况下,可以渲染选定字体中的大多数字符,并以Arial(或包含扩展字形的任何字体)渲染装饰性字符。

    似乎php-gd不支持充分查询字体元数据,以确定是否可以在给定的字体中呈现字符。将字体度量引入PHP的好方法是什么?是否有可以以XML或其他可分析格式转储的命令行实用程序?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Ignacio Vazquez-Abrams    16 年前

    PHP-Cairo 基于pango和fontconfig构建的系统应该有足够的大脑在适当的时候进行字体替换。

        2
  •  1
  •   Dmytro Zavalkin    16 年前

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

        3
  •  1
  •   Scott    16 年前

    如果没有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字符相等,则可以使用它。如果没有,你就不能。

        4
  •  0
  •   sehugg    16 年前

    我最终使用了 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 $<
    
    推荐文章