ตรวจหาร่ายมนตร์ที่หายไปในข้อความ


10

ฉันได้เขียนตัวบ่งชี้ Python3 ที่โทรfortuneและจับเอาท์พุทเพื่อแสดงในการแจ้งเตือนบนหน้าจอ

โชคชะตาบางอย่างมีช่องสี่เหลี่ยมที่มีเลขฐานสิบหกเมื่อสัญลักษณ์ที่เกี่ยวข้องไม่มีอยู่ในแบบอักษรปัจจุบัน แต่ละตารางเป็นตัวแทนของจุดรหัส Unicode เลขฐานสิบหกสำหรับสัญลักษณ์ที่หายไป

ฉันต้องการลบข้อความเลขฐานสิบหกก่อนที่จะแสดงต่อผู้ใช้ ฉันหวังว่าจะได้พบ Python API ซึ่งจะให้ฉันตรวจสอบข้อความตัวอักษรต่ออักขระเพื่อกำหนดสิ่งที่คล้ายchar.isValidCodePoint()หรือคล้ายกัน แต่ฉันไม่พบเช่นนั้น

ผมพบว่าวิธีการแก้ปัญหาที่เป็นไปได้ว่าฉันอยากจะตรวจสอบที่นี่แต่หลังจากติดตั้งfonttoolsผ่าน terminal, fonttools/fontToolsโปรแกรมหลามของฉันไม่สามารถนำเข้า

ความคิดใด ๆ - ไม่ว่าจะใช้ Python API หรือเรียกใช้เทอร์มินัล

อัปเดต # 1: ฉันได้ตระหนักตั้งแต่fonttoolsโค้ดตัวอย่างจากลิงก์ด้านบนจะไม่ทำงานสำหรับฉันเนื่องจากเป็น Python2 ฉันคิดว่าถ้าfonttoolsสามารถใช้อย่างใดฉันสามารถเรียกใช้ Python2 ล่ามจากสคริปต์ Python3 ของฉัน

ปรับปรุง # 2: หลังจากที่จำนวนมากของการอ่าน (ดูอ้างอิงด้านล่าง) ฉันได้พบตั้งแต่fc-matchแต่มันไม่สามารถเสมอไม่ซ้ำกันระบุตัวอักษรในการใช้งาน ฉันได้รับแบบอักษรปัจจุบันใน Python:

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

Ubuntu 11ที่เกิดขึ้นใน ผ่านผลนี้ไปพร้อมกับตัวอักษรเลขฐานสิบหกที่ฉันได้รับรายชื่อของตัวอักษรรวมทั้งpango-view Ubuntuสำหรับความคิดของฉันหากตัวอักษรไม่ได้แสดงผลโดยแบบอักษรแบบอักษรไม่ควรปรากฏในผลลัพธ์จากpango-view!

อ้างอิง:

คำตอบ:


0

นี่เป็นวิธีการที่แตกต่างจากที่คุณไปกับสิ่งนี้ แต่บางทีคุณอาจใช้ python str.replace()หรือre.sub()เมธอดเพื่อแยกสตริงเลขฐานสิบหกออกจากเนื้อหาข้อความของคุณ เช่น:

หากเลขฐานสิบหกสามารถคาดการณ์ได้:

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

หรือถ้าคุณต้องการจับคู่ hex chars ใด ๆ กับนิพจน์ทั่วไป:

import re

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

อภิปรายเพิ่มเติมที่ดีของกลยุทธ์นี้


มันก็โอเคที่จะให้ทางเลือกอื่น แต่ฉันคิดว่าคุณสามารถปรับปรุงคำตอบของคุณได้มากขึ้นโดย 1) เพิ่มรหัสตัวอย่างสั้น ๆ 2) อธิบายถึงข้อดีและข้อเสียที่เป็นไปได้จากโซลูชันเดิมที่เสนอโดยโพสต์และของคุณ
lpanebr

1
ฉันไม่ได้พยายามวิจารณ์คำตอบดั้งเดิมดังนั้นฉันไม่รู้ว่าการเปรียบเทียบ PRO / CON จะมีประโยชน์หรือไม่ ฉันมี แต่เพิ่มตัวอย่างรหัสสำหรับคำแนะนำในการตอบ
Christopher Hunter

@ChristopherHunter: ข้อความที่มาจากโชคเป็นข้อความธรรมดาและเมื่อข้อความนั้นถูกแสดงผลเลขฐานสิบหกจะปรากฏขึ้น (และมันสายเกินไปสำหรับฉันที่จะจับและดำเนินการตามที่คุณแนะนำ)
Bernmeister

0

เอ็นจิ้นการสร้าง Unicode

ใช้เครื่องมือสร้าง Unicode เช่น Harfbuzz เพื่อตรวจจับสัญลักษณ์ที่หายไป นี่คือตัวอย่างการทำงาน:

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'])

เอาท์พุต

registered
.notdef

นี่คือผลลัพธ์ใน IDLE3 ขณะตรวจสอบ:

>>> 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}]

ตรวจสอบเส้นทางตัวอักษรที่ถูกต้องฉันเพิ่งเลือกอันแรกที่ฉันเห็นในเครื่องปัจจุบันของฉัน

บันทึก:

  • ฉันค่อนข้างแน่ใจว่า Gtk / Pango มีฟังก์ชั่นที่คล้ายกัน Pango ได้เปลี่ยนมาใช้ Harfbuzz ในระดับต่ำแล้ว อย่างไรก็ตามฉันไม่มีประสบการณ์ในการใช้ lib ดังกล่าว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.