2010-05-21 19 views
8

Estoy desarrollando un servicio web que representa caracteres utilizando la extensión PHP GD, utilizando una fuente TTF seleccionada por el usuario.PHP-GD: tratar con caracteres Unicode

Esto funciona bien en ASCII-tierra, pero hay algunos problemas:

  1. La cadena a ser prestados entra como UTF-8. Me gustaría limitar la lista de fuentes seleccionables por el usuario para que sean solo aquellas que pueden representar la cadena correctamente, ya que algunas fuentes solo tienen glifos para caracteres ASCII, ISO 8601, etc.

  2. En el caso en que algunos caracteres decorativos están incluidos, estaría bien renderizar la mayoría de los caracteres en la fuente seleccionada y representar los caracteres decorativos en Arial (o cualquier fuente que contenga los glifos extendidos).

No parece como PHP-GD tiene soporte para la consulta de los metadatos de la fuente lo suficiente como para averiguar si un personaje puede ser representado en una fuente dada. ¿Cuál es una buena forma de obtener métricas de fuentes en PHP? ¿Hay una utilidad de línea de comandos que pueda volcarse en XML u otro formato analizable?

+0

acaba de obtener a sí mismo una fuente Unicode. –

Respuesta

0

Terminé usando la utilidad TTX para volcar las métricas de fuentes. Podría inspeccionar los archivos .ttx resultantes y mirar el mapa de caracteres-> glifos. Hice esto manualmente, pero es posible el análisis automático de los archivos XML.

Un ejemplo GNU Makefile que genera los archivos .ttx de un conjunto de fuentes TrueType en el mismo directorio:

all: fontmetrics 

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

clean: 
    rm -f *.ttx 

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

PHP-Cairo construido contra Pango y fontconfig debe tener suficientes cerebros para hacer sustitución de fuentes cuando corresponda.

1

Si usted no tiene una fuente Unicode, usted tendrá que intentar algo así como

<?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)); 
    } 
} 
?> 

Tomado de http://php.net/manual/en/function.utf8-decode.php

Si los mixtos y UTF-8 caracteres son iguales entonces puedes usarlo. Si no, entonces no puedes.

Cuestiones relacionadas