ฉันจะถามสิ่งที่อาจเป็นคำถามโต้เถียง: "หนึ่งในการเข้ารหัสที่นิยมมากที่สุด UTF-16 ถือว่าเป็นอันตรายหรือไม่"
ทำไมฉันถึงถามคำถามนี้
มีโปรแกรมเมอร์กี่คนที่ตระหนักถึงความจริงที่ว่า UTF-16 เป็นความยาวแปรผันได้หรือไม่? โดยสิ่งนี้ฉันหมายความว่ามีจุดรหัสที่แสดงเป็นคู่ตัวแทนแทนใช้องค์ประกอบมากกว่าหนึ่ง
ฉันรู้ว่า; แอปพลิเคชั่นเฟรมเวิร์กและ API จำนวนมากใช้ UTF-16 เช่นสตริงของ Java, สตริง C #, Win32 APIs, ไลบรารี Qt GUI, ไลบรารี ICU Unicode เป็นต้นอย่างไรก็ตามจากทั้งหมดนี้มีข้อบกพร่องพื้นฐานมากมายในการประมวลผล ของอักขระจาก BMP (อักขระที่ควรเข้ารหัสโดยใช้สององค์ประกอบ UTF-16)
ตัวอย่างเช่นลองแก้ไขหนึ่งในตัวละครเหล่านี้:
- LE ( U + 1D11E ) ดนตรีซิมโฟนี G CLEF
- 𝕥 ( U + 1D565 ) คณิตศาสตร์สองชั้นซ้อนขนาดเล็ก
- 𝟶 ( U + 1D7F6 ) ศูนย์หลักสี่เชิงคณิตศาสตร์
- 𠂊 ( U + 2008A ) ตัวละครฮัน
คุณอาจพลาดบางอย่างขึ้นอยู่กับแบบอักษรที่คุณติดตั้ง ตัวละครเหล่านี้ล้วนอยู่นอก BMP (Basic Multilingual Plane) หากคุณไม่สามารถมองเห็นตัวละครเหล่านี้คุณยังสามารถลองมองพวกเขาในการอ้างอิงอักขระ Unicode
ตัวอย่างเช่นลองสร้างชื่อไฟล์ใน Windows ที่มีอักขระเหล่านี้ พยายามลบอักขระเหล่านี้ด้วย "backspace" เพื่อดูว่าอักขระเหล่านั้นทำงานอย่างไรในแอปพลิเคชันต่างๆที่ใช้ UTF-16 ฉันทำการทดสอบและผลลัพธ์ค่อนข้างแย่:
- Opera มีปัญหาในการแก้ไข (ลบ 2 กดที่ backspace)
- Notepad ไม่สามารถจัดการกับมันได้อย่างถูกต้อง (ลบ 2 กดบน backspace ที่จำเป็น)
- การแก้ไขชื่อไฟล์ในหน้าต่างไดอะล็อกเสีย (ต้องลบ 2 กดที่ backspace)
- ทุกการใช้งาน Qt3 ไม่สามารถจัดการกับพวกเขา - การแสดงสองสี่เหลี่ยมที่ว่างแทนสัญลักษณ์หนึ่ง
- Python เข้ารหัสอักขระดังกล่าวไม่ถูกต้องเมื่อใช้โดยตรง
u'X'!=unicode('X','utf-16')
ในบางแพลตฟอร์มเมื่อ X เป็นอักขระนอก BMP - Python 2.5 unicodedata ล้มเหลวในการรับคุณสมบัติของอักขระดังกล่าวเมื่อไพ ธ อนคอมไพล์ด้วยสตริง UTF-16 Unicode
- StackOverflow ดูเหมือนจะลบอักขระเหล่านี้ออกจากข้อความหากแก้ไขโดยตรงในรูปแบบอักขระ Unicode (อักขระเหล่านี้แสดงโดยใช้ HTML Unicode escapes)
- กล่องข้อความ WinForms อาจสร้างสตริงที่ไม่ถูกต้องเมื่อถูก จำกัด ด้วย MaxLength
ดูเหมือนว่าข้อผิดพลาดดังกล่าวหาได้ง่ายมากในหลาย ๆ แอปพลิเคชั่นที่ใช้ UTF-16
ดังนั้น ... คุณคิดว่า UTF-16 น่าจะถือว่าเป็นอันตรายหรือไม่?