Từ C++ 2003 2,13xung đột: định nghĩa của chuỗi wchar_t trong C + + tiêu chuẩn và thực hiện Windows?
Một chuỗi rộng theo nghĩa đen có kiểu “mảng n const wchar_t” và có thời gian lưu trữ tĩnh, trong đó n là kích thước của chuỗi theo quy định dưới đây
Kích thước của một chuỗi chữ lớn là tổng số chuỗi thoát, tên ký tự phổ quát, và các ký tự khác, cộng với một cho kết thúc L '\ 0'.
Từ C++ 0x 2.14.5
Một chuỗi rộng theo nghĩa đen có kiểu “mảng n const wchar_t”, trong đó n là kích thước của chuỗi theo quy định dưới đây
Các kích thước của một char32_t hoặc chuỗi chữ lớn là tổng số chuỗi thoát, tên ký tự phổ quát, và các ký tự khác, cộng với một cho kết thúc U '\ 0' hoặc L '\ 0'.
Kích thước của chuỗi chữ char16_t là tổng số chuỗi thoát, tên ký tự phổ quát và các ký tự khác, cộng với một ký tự cho mỗi ký tự yêu cầu cặp thay thế, cộng với một ký tự kết thúc u ’\ 0’.
Tuyên bố trong C++ 2003 khá mơ hồ. Nhưng trong C++ 0x, khi đếm chiều dài của chuỗi, chuỗi ký tự bằng chữ thường sẽ được xử lý giống như char32_t, và khác với char16_t.
Có một bài mà nêu rõ cách cửa sổ thực hiện wchar_t trong https://stackoverflow.com/questions/402283?tab=votes%23tab-top
Nói tóm lại, wchar_t trong cửa sổ là 16bits và mã hóa sử dụng UTF-16. Các tuyên bố trong tiêu chuẩn rõ ràng để lại một cái gì đó xung đột trong Windows.
ví dụ,
wchar_t kk[] = L"\U000E0005";
này vượt 16bits và UTF-16 nó cần hai 16 bit để mã hóa nó (một cặp thay thế).
Tuy nhiên, từ tiêu chuẩn, kk là một mảng 2 wchar_t (1 cho tên phổ quát \ U000E005, 1 cho \ 0).
Nhưng trong bộ nhớ trong, Windows cần 3 đối tượng wchar_t 16 bit để lưu trữ nó, 2 wchar_t cho cặp thay thế và 1 wchar_t cho \ 0. Vì vậy, từ định nghĩa của mảng, kk là một mảng của 3 wchar_t.
Có vẻ như mâu thuẫn với nhau.
Tôi nghĩ rằng một giải pháp đơn giản nhất cho Windows là "cấm" bất cứ thứ gì yêu cầu cặp thay thế trong wchar_t ("cấm" bất kỳ unicode nào bên ngoài BMP).
Có điều gì sai với hiểu biết của tôi không?
Cảm ơn.
cảm ơn bạn. tôi hiểu rồi. đôi khi thật khó để hiểu một khái niệm mới, nhưng một khi bạn đã có nó, nó trở nên đơn giản ngay lập tức. – user534498
Windows sử dụng kỹ thuật 'WCHAR', không phải' wchar_t'. Nó được đánh máy là "unsigned short' trong quá khứ và có thể trở thành' char16_t' trong tương lai. Nhưng thành thật mà nói, tôi không thấy điều đó xảy ra - các chuỗi ký tự sẽ phá vỡ. – MSalters
@MSalters: Tại sao chuỗi ký tự bị đứt? Đó là những gì các macro 'TEXT (" ... ")' có cho - mọi người không bao giờ được phép sử dụng nguyên 'L" ... "' chữ. Ngoài ra, ít nhất là trên VS2005, 'WCHAR' là một typedef cho' wchar_t', không phải là 'unsigned short'. – casablanca