Я разрабатываю веб-сервис, который представляет символы с помощью расширения PHP GD, с помощью выбранного пользователями шрифта TTF.
Это хорошо работает на земле ASCII, но существует несколько проблем:
Строка, которая будет представлена, входит как UTF-8. Я хотел бы ограничить список выбираемых пользователем шрифтов, чтобы быть только теми, которые могут представить строку правильно, поскольку некоторые шрифты только имеют глифы для символов ASCII, ISO 8601, и т.д.
В случае, где некоторые декоративные символы включены, было бы хорошо представлять большинство символов в выбранном шрифте и представлять декоративные символы в Arial (или независимо от того, что шрифт содержит расширенные глифы).
Не кажется, что PHP-GD имеет поддержку запросов метаданных шрифта достаточно, чтобы выяснить, может ли символ быть представлен в данном шрифте. Что хороший путь состоит в том, чтобы получить метрики шрифта в PHP? Существует ли утилита командной строки, которая может вывести в XML или другом parsable формате?
В итоге я использовал утилиту 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 $<
PHP-Cairo , созданный против Pango, и fontconfig должен иметь достаточно мозгов, чтобы выполнять замену шрифтов, когда это необходимо.
Вы можете попробовать использовать pdf_info_font() из расширения pdflib. Хороший пример: http://www.pdflib.com/pdflib-cookbook/fonts/font-metrics-info/php-font-metrics-info/
Если у вас нет шрифта 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 равны, вы можете использовать его. Если нет, то не получится.