เอาล่ะในสุทธิและ C # สตริงทั้งหมดจะถูกเข้ารหัสเป็นUTF-16LE A string
ถูกจัดเก็บตามลำดับตัวอักษร แต่ละchar
แค็ปซูลจัดเก็บข้อมูล 2 ไบต์หรือ 16 บิต
สิ่งที่เราเห็น "บนกระดาษหรือหน้าจอ" เป็นตัวอักษรตัวเดียวสัญลักษณ์สัญลักษณ์หรือเครื่องหมายวรรคตอนสามารถคิดได้ว่าเป็นองค์ประกอบข้อความเดียว ดังที่อธิบายไว้ในUnicode Standard Annex # 29 การแบ่งส่วนข้อความแบบ UNICODEแต่ละองค์ประกอบข้อความจะถูกแสดงด้วยจุดรหัสหนึ่งจุดหรือมากกว่า รายการครบถ้วนสมบูรณ์ของรหัสสามารถพบได้ที่นี่
จุดรหัสแต่ละจุดจะต้องเข้ารหัสเป็นเลขฐานสองสำหรับการแสดงภายในโดยคอมพิวเตอร์ ตามที่ระบุไว้char
ร้านค้าแต่ละ2 ไบต์ จุดรหัสที่หรือต่ำกว่าสามารถเก็บไว้ในหนึ่งเดียวU+FFFF
char
คะแนนโค้ดด้านบนU+FFFF
จะถูกเก็บไว้เป็นคู่ตัวแทนโดยใช้สองตัวอักษรเพื่อแทนจุดรหัสเดียว
เมื่อพิจารณาจากสิ่งที่เรารู้แล้วว่าเราสามารถอนุมานได้องค์ประกอบข้อความสามารถจัดเก็บเป็นหนึ่งchar
เดียวเป็นคู่ตัวแทนสองตัวอักษรหรือหากองค์ประกอบข้อความนั้นมีตัวแทนหลายจุดรหัสรวมกันของตัวอักษรเดี่ยวและคู่ตัวแทน ราวกับว่าเขาไม่ได้มีความซับซ้อนพอองค์ประกอบข้อความบางส่วนสามารถแสดงโดยชุดที่แตกต่างกันของจุดรหัสตามที่อธิบายไว้ในมาตรฐาน Unicode ภาคผนวก # 15 รูปแบบ
การแสดงสลับฉาก
ดังนั้นสตริงที่มีลักษณะเหมือนกันเมื่อเรนเดอร์สามารถสร้างขึ้นด้วยชุดอักขระที่แตกต่างกัน การเปรียบเทียบลำดับ (ไบต์ต่อไบต์) ของทั้งสองสายดังกล่าวจะตรวจพบความแตกต่างซึ่งอาจไม่คาดคิดหรือไม่พึงประสงค์
คุณสามารถเข้ารหัสสตริง. Net อีกครั้ง เพื่อให้พวกเขาใช้แบบฟอร์มการทำให้เป็นมาตรฐานเดียวกัน เมื่อปรับมาตรฐานแล้วสองสายที่มีองค์ประกอบข้อความเดียวกันจะถูกเข้ารหัสในลักษณะเดียวกัน หากต้องการทำสิ่งนี้ให้ใช้สตริงฟังก์ชั่นNormalize อย่างไรก็ตามโปรดจำไว้ว่าองค์ประกอบข้อความที่แตกต่างกันมีลักษณะคล้ายกัน : -s
ดังนั้นสิ่งนี้หมายถึงอะไรที่เกี่ยวข้องกับคำถาม? ข้อความธาตุ'𠈓'
เป็นตัวแทนจากซิงเกิ้ลพอยท์รหัส U + 20213 CJK ideographs แบบครบวงจรขยายข นี่หมายความว่าไม่สามารถเข้ารหัสเป็นแบบเดี่ยวchar
และต้องเข้ารหัสเป็นคู่ตัวแทนโดยใช้สองตัวอักษร นี่คือเหตุผลที่string b
เป็นหนึ่งอีกต่อไปว่าchar
string a
หากคุณจำเป็นต้องเชื่อถือได้ (ดูข้อแม้) นับจำนวนองค์ประกอบข้อความในตัวstring
คุณควรใช้
System.Globalization.StringInfo
คลาสเช่นนี้
using System.Globalization;
string a = "abc";
string b = "A𠈓C";
Console.WriteLine("Length a = {0}", new StringInfo(a).LengthInTextElements);
Console.WriteLine("Length b = {0}", new StringInfo(b).LengthInTextElements);
ให้ผลผลิต
"Length a = 3"
"Length b = 3"
อย่างที่คาดไว้.
ข้อแม้
การใช้งาน. Net ของการแบ่งส่วนข้อความ Unicode ในStringInfo
และTextElementEnumerator
คลาสควรเป็นประโยชน์โดยทั่วไปและในกรณีส่วนใหญ่จะให้การตอบสนองที่ผู้เรียกคาดหวัง อย่างไรก็ตามตามที่ระบุไว้ในภาคผนวกมาตรฐาน Unicode # 29 "เป้าหมายของการจับคู่การรับรู้ของผู้ใช้ไม่สามารถบรรลุได้อย่างแน่นอนเพราะข้อความเพียงอย่างเดียวไม่ได้มีข้อมูลเพียงพอที่จะตัดสินขอบเขตอย่างชัดเจน"