2013-04-09 809 views
9

Từ một ngôn ngữ kịch bản (Python hay Ruby, nói) trên một hệ thống nền tảng Debian, tôi muốn tìm một trong hai người:Làm thế nào để có thể tìm thấy các điểm mã Unicode mà một phông chữ có glyphs cho, trên một hệ thống dựa trên Debian?

  1. Tất cả các Unicode codepoints rằng một phông chữ đặc biệt có glyphs cho
  2. Tất cả các phông chữ có glyphs cho một Unicode đặc biệt Codepoint

(Rõ ràng một trong hai hình thức 1 hay 2 có thể được bắt nguồn khác, vì vậy bất cứ điều gì dễ dàng hơn sẽ là tuyệt vời.) tôi đã làm điều này trong quá khứ bằng cách chạy:

fc-list : file charset 

... và phân tích cú pháp đầu ra ở cuối mỗi dòng, dựa trên this code from fontconfig nhưng có vẻ như với tôi rằng phải có cách đơn giản hơn nhiều để thực hiện việc này.

(Tôi không hoàn toàn chắc chắn đây là trang web StackExchange phù hợp với câu hỏi này, nhưng tôi đang tìm kiếm một câu trả lời có thể được sử dụng lập trình.)

+0

"Có phải là một cách đơn giản hơn"? Bạn có biết có bao nhiêu định dạng phông chữ không? Và bạn muốn có thể xử lý * tất cả * của họ ?! –

+0

@Kerrek SB: Tôi biết (tất nhiên!) Có nhiều định dạng phông chữ khác nhau, nhưng chúng tôi có thư viện giải quyết vấn đề đó - ví dụ lệnh fontconfig tôi đưa ra trong câu hỏi cung cấp cho bạn thông tin tôi đang theo dõi phông chữ của một số định dạng khác nhau. –

+1

Liên quan: http://stackoverflow.com/questions/4458696/finding-out-what-characters-a-font-supports – leonbloy

Trả lời

6

tôi sẽ cố gắng bất kỳ FreeType 2 language bindings. Dưới đây là một giải pháp Perl vào danh sách các điểm mã Unicode của một phông chữ sử dụng Font::FreeType:

use Font::FreeType; 
Font::FreeType->new->face('DejaVuSans.ttf')->foreach_char(sub { 
    printf("%04X\n", $_->char_code); 
}); 
+0

+1 Cảm ơn, điều đó rất hữu ích - Tôi sẽ đợi một chút trước khi đánh dấu "chấp nhận" trong trường hợp có câu trả lời khác. –

+1

Bất kỳ ý tưởng nào tại sao điều này dường như không nhận thấy glyph được phân bổ cho các khu vực sử dụng cá nhân, chẳng hạn như các lần thay thế thay thế? – tchrist

+0

Không, nhưng nó chắc chắn không phải là một vấn đề bắt nguồn từ các ràng buộc Perl. Từ một cái nhìn nhanh về mã nguồn freetype2, có thể là ['find_unicode_charmap'] (http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/src/base/ftobjs.c#n973) nhầm lẫn sai? – nwellnhof

1

Tôi vừa mới liệt kê các ánh xạ từ codepoints unicode để glypths trong một TTF sử dụng TTX/FontTools. Công cụ đó được viết bằng Python, vì vậy nó khớp với thẻ Python trong bài viết của bạn. Lệnh

ttx -t cmap foo.ttf 

sẽ tạo một tệp XML foo.ttx mô tả ánh xạ đó cho nhiều môi trường và mã hóa khác nhau. Xem ví dụ this reference để biết mô tả nền tảng và định danh mã hóa thực sự có ý nghĩa gì. Tôi cho rằng gói có thể được sử dụng như một thư viện cũng như một công cụ dòng lệnh, nhưng tôi không có kinh nghiệm ở đó.