Phát hiện glyphs bị thiếu trong văn bản


10

Tôi đã viết một trình ứng dụng Python3 để gọi fortunevà chụp đầu ra để hiển thị trong thông báo trên màn hình.

Một số vận may chứa hình vuông có số thập lục phân khi glyph tương ứng không tồn tại trong phông chữ hiện tại. Mỗi ô vuông là đại diện của điểm mã thập lục phân cho glyph bị thiếu.

Tôi muốn xóa văn bản thập lục phân trước khi hiển thị cho người dùng. Tôi đã hy vọng tìm thấy một số API Python cho phép tôi kiểm tra văn bản, từng ký tự, để xác định một cái gì đó giống char.isValidCodePoint()hoặc tương tự nhưng tôi không thể tìm thấy như vậy.

Tôi đã tìm thấy một giải pháp khả thi mà tôi muốn điều tra ở đây nhưng sau khi cài đặt fonttoolsqua thiết bị đầu cuối, chương trình Python của tôi không thể nhập fonttools/fontTools.

Bất kỳ ý tưởng nào - sử dụng API Python hoặc gọi ra thiết bị đầu cuối?

Cập nhật # 1: Tôi đã nhận ra fonttoolsmã mẫu từ liên kết ở trên sẽ không hoạt động với tôi vì nó là Python2. Tôi cho rằng nếu fonttoolsbằng cách nào đó có thể được sử dụng, tôi có thể gọi trình thông dịch Python2 từ tập lệnh Python3 của mình.

Cập nhật # 2: Sau khi đọc rất nhiều (xem tài liệu tham khảo bên dưới), tôi đã tìm thấy fc-matchnhưng nó không thể luôn xác định duy nhất phông chữ đang sử dụng. Tôi có được phông chữ hiện tại trong Python:

from gi.repository import Gio
fontName = Gio.Settings( "org.gnome.desktop.interface" ).get_string( "font-name" )

dẫn đến Ubuntu 11. Vượt qua kết quả này pango-viewcùng với ký tự thập lục phân, tôi nhận được một danh sách các phông chữ bao gồm Ubuntu. Theo suy nghĩ của tôi nếu glyph KHÔNG được hiển thị bởi phông chữ, phông chữ sẽ không xuất hiện trong kết quả từ pango-view!

Người giới thiệu:

Câu trả lời:


0

Đây là một cách tiếp cận khác với nơi bạn sẽ thực hiện với điều này, nhưng có lẽ bạn chỉ có thể sử dụng phương pháp str.replace()hoặc re.sub()phương pháp của python để phân tích các chuỗi thập lục phân khỏi thân văn bản của bạn. I E:

Nếu hex có thể dự đoán được:

originalText = "\xc3\xa5Test"
filteredText = originalText.replace("\xc3\xa5", "")

Hoặc nếu bạn cần khớp bất kỳ ký tự hex nào với biểu thức chính quy:

import re

originalText = "\xc3\xa5Test"
filteredText = re.sub(r'[^\x00-\x7f]', r'', originalText)

Thêm thảo luận tốt về chiến lược này


Bạn có thể đưa ra các tùy chọn thay thế nhưng tôi nghĩ bạn có thể cải thiện câu trả lời của mình bằng cách 1) thêm mã mẫu ngắn 2) mô tả các PRO và CON có thể từ giải pháp đề xuất bài đăng ban đầu và của bạn.
lpanebr

1
Tôi không cố gắng phê bình giải pháp ban đầu nên tôi không biết liệu so sánh PRO / CON có hữu ích ở đây không. Tôi có, tuy nhiên đã thêm các ví dụ mã cho các đề xuất của tôi để trả lời.
Christopher Hunter

@ChristopherHunter: Văn bản xuất phát từ vận may là văn bản thuần túy và chỉ khi văn bản đó được hiển thị thì hệ thập lục phân mới xuất hiện (và đã quá muộn để tôi bắt và xử lý như bạn đề xuất).
Bernmeister

0

Công cụ định hình Unicode

Sử dụng công cụ định hình Unicode như Harfbuzz để phát hiện glyph bị thiếu. Dưới đây là một ví dụ hoạt động:

from pyharfbuzz import shape
f = "/usr/local/lib/python3.6/site-packages/werkzeug/debug/shared/ubuntu.ttf"
t = "®"
s = shape(f, t)
print(s[1]['glyph_name'])
t = "რ"
s = shape(f, t)
print(s[1]['glyph_name'])

Đầu ra

registered
.notdef

Ở đây đầu ra trong IDLE3 trong khi kiểm tra:

>>> t = "®"
>>> s = shape(f, t)
>>> s
[{'cluster': 0, 'glyph_name': 'registered', 'x_advance': 29.453125, 'y_advance': 0.0, 'x_offset': 0.0, 'y_offset': 0.0}]
>>> t = "რ"
>>> s = shape(f, t)
>>> s
[{'cluster': 0, 'glyph_name': '.notdef', 'x_advance': 36.0, 'y_advance': 0.0, 'x_offset': 0.0, 'y_offset': 0.0}]

Kiểm tra đường dẫn phông chữ chính xác, tôi chỉ chọn cái đầu tiên tôi thấy trong máy hiện tại của mình.

Ghi chú:

  • Tôi chắc chắn rằng Gtk / Pango có chức năng tương tự, Pango đã chuyển sang sử dụng Harfbuzz ở mức độ thấp. Tuy nhiên, tôi không có kinh nghiệm sử dụng lib như vậy.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.