2013-01-21 26 views
6

Sự hiểu biết hiện tại của tôi về sự khác biệt giữa std::stringstd::wstring chỉ đơn giản là loại bộ đệm; cụ thể là, charwchar_t, tương ứng.std :: chuỗi, wstring, u16/32 làm rõ chuỗi

Tôi cũng đọc rằng hầu hết (nếu không phải tất cả) distro Linux sử dụng char cho bất kỳ và tất cả các chuỗi, cả ASCII cũng như UTF, trong đó Windows là hệ điều hành chính sử dụng wchar_t nữa.

Tuy nhiên, có một vài loại chuỗi khác mà tôi muốn đi thẳng vào đầu: u16stringu32string, là các chuỗi có bộ đệm 2 byte và 4 byte tương ứng.

Vì vậy, câu hỏi của tôi là thế này:

Trên nền tảng với sizeof(wchar_t) == 2, là std::wstring chức năng tương đương để std::u16string, cũng như nền tảng với sizeof(wchar_t) == 4std::u32string?

+0

có một câu hỏi tương tự về SO về chuỗi/wstring [ở đây

+1

@FloreaMarian Không thực sự - câu hỏi đó là yêu cầu sự khác biệt giữa 'chuỗi 'và' wstring'. Tôi hỏi có hay không 'wstring' giống với' u16string' hoặc 'u32string' tùy thuộc vào kích thước của' wchar_t'. – Qix

+1

xem http://utf8everywhere.org –

Trả lời

14

Sự khác biệt là chi tiết của charwchar_t được thực hiện xác định, trong khi mã hóa char16_tchar32_t được xác định rõ ràng theo tiêu chuẩn C++ 11.

Điều này có nghĩa rằng wstringkhả năng để lưu trữ các dữ liệu giống như một trong hai u16string hoặc u32string, nhưng chúng tôi không biết cái nào. Và nó được cho phép thực hiện một số lẻ để làm cho tất cả chúng khác nhau, vì kích thước và mã hóa của các kiểu char cũ không được xác định bởi tiêu chuẩn.

+1

'wstring' sẽ * không bao giờ * giống như các loại chuỗi khác. Tiêu chuẩn * yêu cầu * 'wchar_t' là một kiểu riêng biệt từ' char16_t' và 'char32_t'. Trên thực tế, chúng có cùng kiểu cơ sở và cùng mã hóa, nhưng 'is_same ' sẽ * không bao giờ * là 'true' cho bất kỳ thực thi C++ hợp lệ nào. –

+1

"Tương tự" ở đây có nghĩa là "tương đương về chức năng", giống như trong câu hỏi. Nếu 'sizeof (wchar_t) == 4' bạn sẽ rất có khả năng nhận được kết quả tương tự từ việc sử dụng' wstring' hoặc 'u32string'. –