2010-05-21 41 views
8

Tôi đang phát triển dịch vụ web hiển thị các ký tự bằng cách sử dụng phần mở rộng GD GD, sử dụng phông chữ TTF do người dùng chọn.PHP-GD: Xử lý các ký tự Unicode

này hoạt động tốt trong ASCII-đất, nhưng có một vài vấn đề:

  1. Chuỗi để được trả lại do thỏa thuận như UTF-8. Tôi muốn giới hạn danh sách phông chữ do người dùng chọn chỉ là những phông chữ có thể hiển thị đúng chuỗi, vì một số phông chữ chỉ có glyph cho ký tự ASCII, ISO 8601, v.v.

  2. Trong trường hợp một số ký tự trang trí được bao gồm, nó sẽ là tốt để làm cho phần lớn các ký tự trong phông chữ được lựa chọn và làm cho các nhân vật trang trí trong Arial (hoặc bất kỳ phông chữ có chứa glyphs mở rộng).

Có vẻ như PHP-GD không hỗ trợ truy vấn siêu dữ liệu phông để tìm hiểu xem ký tự có được hiển thị trong một phông chữ nhất định hay không. Một cách tốt để có được số liệu phông chữ vào PHP là gì? Có một tiện ích dòng lệnh có thể đổ trong XML hoặc định dạng phân tích cú pháp khác không?

+0

Chỉ cần có được cho mình một phông chữ unicode. –

Trả lời

0

Tôi đã sử dụng tiện ích TTX để kết xuất các chỉ số phông chữ. Sau đó tôi có thể kiểm tra các tập tin kết quả .ttx và xem bản đồ ký tự -> glyph. Tôi đã thực hiện việc này theo cách thủ công, nhưng có thể phân tích cú pháp tự động các tệp XML.

Một ví dụ GNU Makefile mà tạo ra các tập tin .ttx từ một tập hợp các phông chữ TrueType trong cùng thư mục:

all: fontmetrics 

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

clean: 
    rm -f *.ttx 

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

PHP-Cairo được xây dựng chống lại Pango và fontconfig phải có đủ bộ não để thực hiện thay thế phông chữ khi thích hợp.

1

Nếu bạn không có một phông chữ unicode, bạn sẽ cần phải thử một cái gì đó giống như

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

Taken từ http://php.net/manual/en/function.utf8-decode.php

Nếu hỗn hợp và utf-8 ký tự bằng nhau thì bạn có thể sử dụng nó. Nếu không, thì bạn không thể.

Các vấn đề liên quan