PHP-GD: работа с символами Юникода - PullRequest
8 голосов
/ 21 мая 2010

Я занимаюсь разработкой веб-службы, которая отображает символы с использованием расширения PHP GD с использованием выбранного шрифта TTF.

Это нормально работает в ASCII-стране, но есть несколько проблем:

  1. Строка, которая будет отображена, имеет вид UTF-8. Я хотел бы ограничить список выбираемых пользователем шрифтов только теми, которые могут правильно отображать строку, поскольку некоторые шрифты имеют глифы только для символов ASCII, ISO 8601 и т. Д.

  2. В случае, если включены некоторые декоративные символы, было бы хорошо отрисовывать большинство символов в выбранном шрифте и отображать декоративные символы в Arial (или любом другом шрифте, содержащем расширенные глифы).

Похоже, что PHP-GD не поддерживает запросы метаданных шрифта в достаточной степени, чтобы выяснить, можно ли отобразить символ заданным шрифтом. Что такое хороший способ получить метрики шрифта в PHP? Существует ли утилита командной строки, которая может создавать дампы в XML или другом формате с возможностью анализа?

Ответы [ 4 ]

2 голосов
/ 21 мая 2010

PHP-Cairo , созданный для Pango и fontconfig, должен иметь достаточно мозгов для замены шрифта, когда это уместно.

1 голос
/ 26 мая 2010

Если у вас нет шрифта 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 равны, вы можете использовать их. Если нет, то вы не можете.

1 голос
/ 21 мая 2010

Вы можете попробовать использовать pdf_info_font () из расширения pdflib. Хороший пример есть: http://www.pdflib.com/pdflib-cookbook/fonts/font-metrics-info/php-font-metrics-info/

0 голосов
/ 18 августа 2010

В итоге я использовал утилиту TTX для вывода метрик шрифта. Затем я мог бы проверить получившиеся файлы .ttx и посмотреть на карту символов-> глифов. Я сделал это вручную, но возможен автоматический анализ файлов XML.

Пример GNU Makefile, который генерирует файлы .ttx из набора шрифтов TrueType в одном каталоге:

all: fontmetrics

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

clean:
    rm -f *.ttx

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