PHP-GD: Unicode karakterleri ile başa çıkmak

4 Cevap php

Ben bir kullanıcı tarafından seçilen TTF yazı tipi kullanılarak, PHP GD uzantısı kullanan karakterleri işleyen bir web hizmeti geliştiriyorum.

Bu ASCII topraklarda çalışıyor, ama bir kaç sorun vardır:

  1. Işlenecek dize UTF-8 olarak geliyor. Ben düzgün bir dize hale hangi yalnızca bazı fontlar yalnızca ASCII karakterleri motifi olarak, ISO 8601, vb olmak üzere kullanıcı tarafından seçilebilir yazı tiplerinin listesini sınırlamak istiyorum

  2. Bazı dekoratif karakterler içerdiği durumda, seçilen yazı karakterlerin çoğunluğu işlemek ve Arial (veya ne olursa olsun yazı genişletilmiş motifleri içeren) içinde dekoratif karakterleri oluşturmak için iyi olurdu.

PHP-GD bir karakter belirli bir yazı kılınabilir olmadığını anlamaya yeterince yazı meta sorgulamak için destek var gibi görünmüyor. PHP içine yazı tipi ölçülerine almak için iyi bir yolu nedir? XML veya diğer çözümlenebilir formatında dökümü bir komut satırı yardımcı programı var mı?

4 Cevap

Ben yazı tipi ölçülerine dökümü TTX programını kullanarak sona erdi. Daha sonra çıkan. Ttx dosyaları incelemek ve karakter-> kabartma harita bakmak olabilir. Ben bu el yaptım, ancak XML dosyaları otomatik ayrıştırma mümkündür.

. Aynı dizinde TrueType yazı dizisinden ttx dosyalar üretir bir örnek GNU Makefile:

all: fontmetrics

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

clean:
    rm -f *.ttx

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

PHP-Cairo Pango'nun karşı inşa ve fontconfig uygun olduğunda yazı tipi değiştirme yapmak için yeterli beyne sahip olmalıdır.

Sen pdflib uzantısı pdf_info_font () kullanmayı deneyebilirsiniz. İyi örnek var: http://www.pdflib.com/pdflib-cookbook/fonts/font-metrics-info/php-font-metrics-info/

Bir unicode yazı tipi yoksa, gibi bir şey denemek gerekir

 <?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 alınan

Karma ve utf-8 karakterler eşit ise bunu kullanabilirsiniz. Değilse, o zaman yapamazsın.