ทุกสิ่งที่คุณไม่เคยอยากรู้เกี่ยวกับ Unicode Normalization
มาตรฐานที่ยอมรับได้
Unicode มีหลายวิธีในการเข้ารหัสอักขระบางตัวอักขระที่เน้นเสียงโดยเฉพาะ การปรับมาตรฐานตามมาตรฐานจะเปลี่ยนจุดรหัสเป็นรูปแบบการเข้ารหัสที่ยอมรับได้ จุดโค้ดที่เป็นผลลัพธ์ควรจะปรากฏเหมือนกับจุดเดิมที่ป้องกันจุดบกพร่องใด ๆ ในฟอนต์หรือเอ็นจิ้นการแสดงผล
เมื่อต้องการใช้
เนื่องจากผลลัพธ์ที่ออกมาเหมือนกันจึงปลอดภัยเสมอที่จะใช้การปรับมาตรฐานตามรูปแบบบัญญัติกับสตริงก่อนที่จะจัดเก็บหรือแสดงผลตราบใดที่คุณสามารถยอมรับผลลัพธ์ที่ไม่เป็นบิตต่อบิตเหมือนกับอินพุตได้
การปรับมาตรฐานตามมาตรฐานมี 2 รูปแบบ: NFD และ NFC ทั้งสองมีความเท่าเทียมกันในแง่ที่ว่าหนึ่งสามารถแปลงระหว่างสองรูปแบบนี้โดยไม่สูญเสีย การเปรียบเทียบสตริงสองสายภายใต้ NFC จะให้ผลลัพธ์เหมือนกับการเปรียบเทียบภายใต้ NFD เสมอ
NFD
NFD มีการขยายตัวอักษรอย่างเต็มที่ นี่เป็นรูปแบบการนอร์มัลไลเซชันที่เร็วกว่าในการคำนวณ แต่ผลลัพธ์จะมีจุดรหัสมากขึ้น (เช่นใช้พื้นที่มากขึ้น)
หากคุณเพียงต้องการเปรียบเทียบสองสตริงที่ยังไม่ได้ทำให้เป็นมาตรฐานนี่คือรูปแบบการปรับมาตรฐานที่ต้องการเว้นแต่คุณจะรู้ว่าคุณต้องการการปรับมาตรฐานความเข้ากันได้
เอ็นเอฟซี
NFC จะรวมจุดรหัสใหม่เมื่อทำได้หลังจากเรียกใช้อัลกอริทึม NFD การดำเนินการนี้ใช้เวลานานกว่าเล็กน้อย แต่ส่งผลให้สตริงสั้นลง
Normalization ที่เข้ากันได้
Unicode ยังมีอักขระจำนวนมากที่ไม่ได้เป็นของจริง แต่ถูกใช้ในชุดอักขระดั้งเดิม Unicode เพิ่มสิ่งเหล่านี้เพื่อให้ข้อความในชุดอักขระเหล่านั้นประมวลผลเป็น Unicode จากนั้นจะถูกแปลงกลับโดยไม่สูญเสีย
การปรับมาตรฐานความเข้ากันได้จะแปลงสิ่งเหล่านี้เป็นลำดับที่สอดคล้องกันของอักขระ "จริง" และยังทำการนอร์มัลไลเซชันตามรูปแบบบัญญัติ ผลลัพธ์ของการปรับมาตรฐานความเข้ากันได้อาจไม่เหมือนกับต้นฉบับ
อักขระที่มีข้อมูลการจัดรูปแบบจะถูกแทนที่ด้วยอักขระที่ไม่มี ยกตัวอย่างเช่นตัวอักษรที่ได้รับการแปลง⁹
9
คนอื่น ๆ ไม่เกี่ยวข้องกับความแตกต่างของการจัดรูปแบบ ยกตัวอย่างเช่นตัวอักษรเลขโรมันจะถูกแปลงเป็นตัวอักษรปกติⅨ
IX
เห็นได้ชัดว่าเมื่อทำการเปลี่ยนแปลงนี้แล้วจะไม่สามารถแปลงกลับไปเป็นชุดอักขระดั้งเดิมได้อีกต่อไป
ควรใช้เมื่อใด
Unicode Consortium แนะนำให้คิดถึงการทำให้เป็นมาตรฐานเดียวกันเช่นการToUpperCase
แปลง มันเป็นสิ่งที่อาจมีประโยชน์ในบางสถานการณ์ แต่คุณไม่ควรใช้มันอย่างเต็มใจ
กรณีการใช้งานที่ดีจะเป็นเครื่องมือค้นหาตั้งแต่คุณอาจจะต้องการค้นหาสำหรับการแข่งขัน9
⁹
สิ่งหนึ่งที่คุณไม่ควรทำคือแสดงผลลัพธ์ของการนำการปรับมาตรฐานความเข้ากันได้ไปใช้กับผู้ใช้
NFKC / NFKD
แบบฟอร์มการปรับมาตรฐานความเข้ากันได้มีสองรูปแบบ NFKD และ NFKC พวกเขามีความสัมพันธ์เช่นเดียวกับระหว่าง NFD และ C
สตริงใด ๆ ใน NFKC ก็อยู่ใน NFC เช่นเดียวกันและเหมือนกันสำหรับ NFKD และ NFD ดังนั้นNFKD(x)=NFD(NFKC(x))
และNFKC(x)=NFC(NFKD(x))
อื่น ๆ
ข้อสรุป
หากมีข้อสงสัยให้ใช้การปรับมาตรฐานตามรูปแบบบัญญัติ เลือก NFC หรือ NFD ตามพื้นที่ / ความเร็วในการแลกเปลี่ยนที่เกี่ยวข้องหรือขึ้นอยู่กับสิ่งที่จำเป็นสำหรับบางสิ่งที่คุณกำลังดำเนินการระหว่างกัน