จากคำถามที่เกี่ยวข้องฉันต้องการถามเกี่ยวกับอักขระใหม่และประเภทลิเทอรัลสตริงใน C ++ 11 ดูเหมือนว่าตอนนี้เรามีอักขระสี่ประเภทและตัวอักษรสตริงห้าประเภท ประเภทอักขระ:
char a = '\x30'; // character, no semantics
wchar_t b = L'\xFFEF'; // wide character, no semantics
char16_t c = u'\u00F6'; // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4
และตัวอักษรสตริง:
char A[] = "Hello\x0A"; // byte string, "narrow encoding"
wchar_t B[] = L"Hell\xF6\x0A"; // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6"; // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto E[] = u8"\u00F6\U0010FFFF"; // (3)
คำถามคือ: คือ\x/ \u/ \Uอ้างอิงตัวได้อย่างอิสระร่วมกับทุกประเภทสตริง? ประเภทสตริงทั้งหมดมีความกว้างคงที่หรือไม่กล่าวคืออาร์เรย์มีองค์ประกอบอย่างแม่นยำเท่าที่ปรากฏในลิเทอรัลหรือถึง\x/ \u/ \Uการอ้างอิงจะขยายเป็นจำนวนไบต์ตัวแปรหรือไม่ Do u""และu8""สตริงมีการเข้ารหัสความหมายเช่นฉันพูดได้char16_t x[] = u"\U0010FFFF"ไหมและจุดรหัสที่ไม่ใช่ BMP ได้รับการเข้ารหัสเป็นลำดับ UTF16 สองหน่วยหรือไม่ และในทำนองเดียวกันสำหรับu8? ใน (1) ฉันสามารถเขียนตัวแทนคนเดียวด้วยได้\uหรือไม่? สุดท้ายมีการเข้ารหัสฟังก์ชันสตริงใด ๆ ที่รับรู้ (กล่าวคือเป็นอักขระที่รับรู้และสามารถตรวจจับลำดับไบต์ที่ไม่ถูกต้องได้)
นี่เป็นคำถามปลายเปิดเล็กน้อย แต่ฉันต้องการให้ภาพที่สมบูรณ์ที่สุดเท่าที่จะเป็นไปได้ของการเข้ารหัส UTF ใหม่และสิ่งอำนวยความสะดวกประเภทของ C ++ 11 ใหม่
u"\U0010FFFF"เป็นคู่ตัวแทน