Sau một câu hỏi liên quan , tôi muốn hỏi về các kiểu ký tự chuỗi và ký tự mới trong C ++ 11. Có vẻ như bây giờ chúng ta có bốn loại ký tự và năm loại ký tự chuỗi. Các loại ký tự:
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
Và chuỗi ký tự:
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)
Câu hỏi đặt ra là: Liệu các \x
/ \u
/ \U
nhân vật tài liệu tham khảo một cách tự do kết hợp được với tất cả các loại chuỗi? Có phải tất cả các kiểu chuỗi đều có độ rộng cố định, tức là các mảng chứa chính xác bao nhiêu phần tử xuất hiện trong nghĩa đen, hoặc tham chiếu đến \x
/ \u
/ \U
được mở rộng thành một số byte thay đổi? Các chuỗi u""
và u8""
chuỗi có ngữ nghĩa mã hóa không, chẳng hạn như tôi có thể nói char16_t x[] = u"\U0010FFFF"
, và mã điểm không phải BMP được mã hóa thành một chuỗi UTF16 hai đơn vị? Và tương tự cho u8
? Trong (1), tôi có thể viết các đại diện đơn lẻ với \u
? Cuối cùng, có bất kỳ mã hóa hàm chuỗi nào không (nghĩa là chúng nhận biết ký tự và có thể phát hiện chuỗi byte không hợp lệ)?
Đây là một câu hỏi mở một chút, nhưng tôi muốn có được bức tranh toàn cảnh nhất có thể về cơ sở mã hóa và loại UTF mới của C ++ 11 mới.
u"\U0010FFFF"
thành một cặp thay thế.