เรียน String ตามกราฟ?


9

ฉันสงสัยว่าทำไมเราไม่มีคลาสสตริงที่แสดงสตริง Unicode grapheme clusters แทนที่จะเป็นรหัสจุดหรือตัวอักษร สำหรับฉันแล้วดูเหมือนว่าในแอปพลิเคชั่นส่วนใหญ่มันจะง่ายกว่าสำหรับโปรแกรมเมอร์ที่จะเข้าถึงส่วนประกอบของกราฟเมื่อจำเป็นกว่าที่จะต้องจัดระเบียบมันจากจุดรหัสซึ่งดูเหมือนจำเป็นแม้ว่าจะหลีกเลี่ยงการทำลายสตริงใน "mid-grapheme" (อย่างน้อยก็ในทางทฤษฎี) ภายในคลาสสตริงอาจใช้การเข้ารหัสความยาวตัวแปรเช่น UTF-8, UTF-16 หรือในบริบทนี้แม้ UTF-32 คือความยาวตัวแปร หรือใช้คลาสย่อยสำหรับพวกเขาทั้งหมด (และกำหนดค่าตัวเลือกในขณะใช้งานเพื่อให้ภาษาต่าง ๆ สามารถใช้การเข้ารหัสที่เหมาะสมที่สุด) แต่ถ้าโปรแกรมเมอร์สามารถ "เห็น" หน่วยกราฟเมื่อตรวจสอบสตริงจะไม่ '


ฉันเดาว่าเวลาผ่านไปสักครู่และตอนนี้เรามีสองภาษาที่ทำสิ่งนี้จริง ๆ : D
Trejkaz

คำตอบ:


4

ดูเหมือนว่าวิธีที่ดีที่สุดที่จะได้รับความถูกต้องก็คือการป้องกันไม่ให้โปรแกรมเมอร์ทำ "การแฮ็คสตริง" ... ไม่สามารถเขียนคำห่อคำยัติภังค์จำนวนคำการให้เหตุผลการเคลื่อนไหวของเคอร์เซอร์ ฯลฯ เฟรมเวิร์ก UI ที่ทันสมัยทั้งหมดจะทำสิ่งนี้ให้คุณในวันนี้

นั่นคือสิ่งที่เป็นนามธรรมที่คุณมักจะทำงานด้วยคือ "วัตถุแสดงย่อหน้า" มากกว่าเช่นสำหรับ GTK: http://library.gnome.org/devel/pango/stable/pango-Layout-Objects.html

มากกว่าสตริงกราฟเช่น: http://library.gnome.org/devel/pango/stable/pango-Glyph-Storage.html

ในการไปที่สตริงของ glyphs คุณต้องมีข้อมูลที่มีเฉพาะในระดับ "มุมมอง" ดังนั้นการใช้สตริงส่วนใหญ่จึงอาจไม่มีข้อมูลนี้ ตัวอย่างเช่นคุณต้องรู้ว่าตัวอักษรเพราะแบบอักษรสามารถมีลิ้นที่แตกต่างกัน

นอกเหนือจากเรื่องการปฏิบัติประเภทนั้นแล้วร่ายมนตร์อาจไม่ใช่สิ่งที่คุณต้องการ

ในบริบทจำนวนมากคุณต้องการใช้แอตทริบิวต์ Unicode ที่เหมาะสมซึ่งแสดงใน API นี้ตัวอย่าง: http://library.gnome.org/devel/pango/stable/pango-Text-Processing.html#PangoLogAttr

อย่างที่คุณเห็นจากโครงสร้างนั้น (ซึ่งสะท้อนให้เห็นถึงอัลกอริธึม Unicode) การทำสิ่งต่าง ๆ ที่ขอบเขตสัญลักษณ์ไม่ได้ถูกต้องมากไปกว่าการทำที่ขอบเขตอักขระ

รายละเอียดทั้งสองนี้อธิบายอัลกอริทึมเพื่อค้นหาขอบเขตที่แตกต่าง:

การประมวลผลข้อความเกี่ยวข้องกับการค้นหาขอบเขตเหล่านั้นด้วยอัลกอริธึมแล้วทำงานกับขอบเขต

หากคุณเริ่มต้นค้นหาว่ามันยากแค่ไหนในการจัดการทุกภาษาอย่างถูกต้องคุณจะรู้ได้อย่างรวดเร็วว่าคุณต้องการห้องสมุดที่มีทั้งย่อหน้าและจัดการอย่างถูกต้อง Windows, Mac, Linux (Qt และ GTK) และ Java ทั้งหมดมาพร้อมกับสิ่งอำนวยความสะดวกสำหรับสิ่งนี้รวมถึงตัวอย่างเช่นhttp://site.icu-project.org/

เมื่อเขียนเว็บแอปโชคไม่ดีที่คุณต้องปล่อยให้เบราว์เซอร์ (อาจช่วยโดยระบบปฏิบัติการ) ทำสิ่งนี้เท่าที่ฉันรู้ สิ่งที่คุณสามารถทำได้ใน JavaScript หรือในฝั่งเซิร์ฟเวอร์ก็ทำให้ยุ่งเหยิง

บางทีฉันอาจจะสรุปคำตอบว่า: การจัดการสตริงส่วนใหญ่ในข้อความภาษาธรรมชาติเสียดังนั้นจึงไม่ค่อยมีความกังวลเกี่ยวกับคลาสสตริงนอกจากจะมีวิธีที่ไม่มีเมท็อด ;-)

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