05-19-2020, 10:20 PM
ข้อมูลเสริม
วิธีการแทนที่ตัวอักษรเป็นการพึ่งพาระบบ fallback ของวรรณยุกต์สูงต่ำและอักษรพิเศษ ซึ่งจะมีใน Truetype และ Opentype (ไม่ใช่ทุกตัว) โดยคาดหวังว่ามันจะอยู่ในตำแหน่ง Unicode ที่นิยมกัน
แต่ในความเป็นจริงไม่ใช่ว่าฟอนต์ไทยทุกฟอนต์จะมีอักษร fallback และบางฟอนต์ก็เอาอักษร fallback ไปไว้ที่ตำแหน่งอื่น (อย่างฟอนต์ สารบัญ รุ่นแรกๆ มีการเอาอักษรไปใส่ทับที่อักษรละตินเฉยเลย)
ดังนั้นวิธีที่ดีสุดคืออ่านค่าจากตาราง gsub และ gpos ของฟอนต์ เพื่อดูว่าตำแหน่งของวรรณยุกต์ควรอยู่ที่ไหน โดยดูจากค่า mark to base (mark) และ mark to mark (mkmk) และค่าอื่นๆเช่น kerning
ข้อมูลเพิ่มเติม => https://docs.microsoft.com/en-us/typogra...pment/thai
สาเหตุที่อักษรไทยในจุดอื่นๆ สามารถแสดงผลได้ถูกต้องเป็นเพราะ RMMV ใช้ webkit ซึ่งเขาได้ทำระบบมารองรับการอ่านค่าจากฟอนต์มาอยู่แล้ว แต่ Window Message เป็นกรณีพิเศษ เพราะต้องพิมพ์ตัวอักษรแบบ letter by letter เลยทำระบบของตัวเองออกมา
สรุปถ้าจะให้แสดงผลได้ถูกต้องจริงๆจึงควรเขียน script ที่อ่านข้อมูลจากฟอนต์ออกมาจริงๆ เช่น Harfbuzz (ปกติในเกมเอนจิ้นจะใช้ตัวนี้) มีแบบ javascript ด้วยนะ https://github.com/prezi/harfbuzz-js
ในการประมวลผลเพื่อให้ได้ Unicode ที่ถูกต้องจริงๆในฟอนต์นั้น รวมถึงการวางตำแหน่งวรรณยุกต์ว่ามีระดับความสูงเท่าไหร่
โดยปกติฟอนต์ทั่วๆไป (Truetype หรือ Opentype) จะมี fallback รองรับอยู่แล้ว ในตำแหน่งมาตรฐาน เลยลักไก่ด้วยการแทนที่ตัวอักษรแบบนั้นได้ แต่ไม่ใช่ทุกฟอนต์จะทำตามมาตรฐานนี้ เพราะมาตรฐานจริงๆก็คือให้อ่านค่าตามในฟอนต์ (โดยเฉพาะพวก Opentype)
วิธีการแทนที่ตัวอักษรเป็นการพึ่งพาระบบ fallback ของวรรณยุกต์สูงต่ำและอักษรพิเศษ ซึ่งจะมีใน Truetype และ Opentype (ไม่ใช่ทุกตัว) โดยคาดหวังว่ามันจะอยู่ในตำแหน่ง Unicode ที่นิยมกัน
แต่ในความเป็นจริงไม่ใช่ว่าฟอนต์ไทยทุกฟอนต์จะมีอักษร fallback และบางฟอนต์ก็เอาอักษร fallback ไปไว้ที่ตำแหน่งอื่น (อย่างฟอนต์ สารบัญ รุ่นแรกๆ มีการเอาอักษรไปใส่ทับที่อักษรละตินเฉยเลย)
ดังนั้นวิธีที่ดีสุดคืออ่านค่าจากตาราง gsub และ gpos ของฟอนต์ เพื่อดูว่าตำแหน่งของวรรณยุกต์ควรอยู่ที่ไหน โดยดูจากค่า mark to base (mark) และ mark to mark (mkmk) และค่าอื่นๆเช่น kerning
ข้อมูลเพิ่มเติม => https://docs.microsoft.com/en-us/typogra...pment/thai
สาเหตุที่อักษรไทยในจุดอื่นๆ สามารถแสดงผลได้ถูกต้องเป็นเพราะ RMMV ใช้ webkit ซึ่งเขาได้ทำระบบมารองรับการอ่านค่าจากฟอนต์มาอยู่แล้ว แต่ Window Message เป็นกรณีพิเศษ เพราะต้องพิมพ์ตัวอักษรแบบ letter by letter เลยทำระบบของตัวเองออกมา
สรุปถ้าจะให้แสดงผลได้ถูกต้องจริงๆจึงควรเขียน script ที่อ่านข้อมูลจากฟอนต์ออกมาจริงๆ เช่น Harfbuzz (ปกติในเกมเอนจิ้นจะใช้ตัวนี้) มีแบบ javascript ด้วยนะ https://github.com/prezi/harfbuzz-js
ในการประมวลผลเพื่อให้ได้ Unicode ที่ถูกต้องจริงๆในฟอนต์นั้น รวมถึงการวางตำแหน่งวรรณยุกต์ว่ามีระดับความสูงเท่าไหร่
โดยปกติฟอนต์ทั่วๆไป (Truetype หรือ Opentype) จะมี fallback รองรับอยู่แล้ว ในตำแหน่งมาตรฐาน เลยลักไก่ด้วยการแทนที่ตัวอักษรแบบนั้นได้ แต่ไม่ใช่ทุกฟอนต์จะทำตามมาตรฐานนี้ เพราะมาตรฐานจริงๆก็คือให้อ่านค่าตามในฟอนต์ (โดยเฉพาะพวก Opentype)