Tôi đã gặp phải một vấn đề thú vị trên Windows 8. Tôi đã thử nghiệm Tôi có thể đại diện cho các ký tự Unicode được ra khỏi BMP với chuỗi wchar_t *. Các mã kiểm tra sau sản xuất kết quả bất ngờ đối với tôi:Kích thước của wchar_t * cho cặp thay thế (Unicode ký tự trong BMP) trên Windows
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2, the size of wchar_t on Windows.
int i2 = sizeof(s1); // i2 == 4, because of the terminating '\0' (I guess).
int i3 = sizeof(s2); // i3 == 4, why?
U + 2008a là Han character, đó là ra khỏi nhị phân đa ngôn ngữ Pane, vì vậy nó cần được đại diện bởi một cặp thay thế trong UTF-16. Có nghĩa là - nếu tôi hiểu nó một cách chính xác - rằng nó phải được đại diện bởi hai nhân vật wchar_t. Vì vậy, tôi mong đợi sizeof (s2) là 6 (4 cho hai wchar_t-s của cặp thay thế và 2 cho kết thúc \ 0).
Vậy tại sao sizeof (s2) == 4? Tôi đã kiểm tra chuỗi s2 đã được xây dựng chính xác, bởi vì tôi đã kết xuất nó với DirectWrite và ký tự Hán đã được hiển thị chính xác.
CẬP NHẬT: Như Naveen đã chỉ ra, tôi đã cố xác định kích thước của các mảng không chính xác. Đoạn mã dưới đây tạo ra kết quả chính xác:
const wchar_t* s1 = L"a";
const wchar_t* s2 = L"\U0002008A"; // The "Han" character
int i1 = sizeof(wchar_t); // i1 == 2, the size of wchar_t on Windows.
std::wstring str1 (s1);
std::wstring str2 (s2);
int i2 = str1.size(); // i2 == 1.
int i3 = str2.size(); // i3 == 2, because two wchar_t characters needed for the surrogate pair.
Đúng tất nhiên, cảm ơn. Sry cho câu hỏi ngu ngốc ... –
"Nó không có gì để làm với các ký tự được lưu trữ trong s2" - Kể từ khi câu hỏi được gây ra bởi sự hiểu lầm giữa con trỏ và những điều chỉ ra, bạn nên tránh gây ra một sự hiểu lầm như thế. Không có ký tự được lưu trữ trong s2. Trong trường hợp này, có một ký tự được lưu trữ trong s2 [0] và s2 [1]. Nếu nó không phải là một cặp thay thế thì sẽ có một ký tự được lưu trữ trong s2 [0] một mình, tức là trong * s2. –
@Windowsprogrammer: Đã sửa lỗi. –