PHP-GD: Контакт с символами Unicode

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

Это хорошо работает на земле ASCII, но существует несколько проблем:

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

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

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

8
задан genesis 9 September 2011 в 13:30
поделиться

4 ответа

В итоге я использовал утилиту 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 $<
0
ответ дан 6 December 2019 в 00:05
поделиться

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

2
ответ дан 6 December 2019 в 00:05
поделиться

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

1
ответ дан 6 December 2019 в 00:05
поделиться

Если у вас нет шрифта 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
ответ дан 6 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: