จากคำถามที่เกี่ยวข้องฉันต้องการถามเกี่ยวกับอักขระใหม่และประเภทลิเทอรัลสตริงใน 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"
เป็นคู่ตัวแทน