Trong C++ 0x, char16_t
và char32_t
sẽ được sử dụng để lưu trữ UTF-16 và UTF-32 chứ không phải wchar_t
.
Từ dự thảo n2798:
22.2.1.4 Lớp mẫu codecvt
2 codecvt lớp là để sử dụng khi chuyển đổi từ một bộ mã khác, chẳng hạn như từ ký tự rộng để multibyte ký tự hoặc giữa các mã hóa ký tự rộng như Unicode và EUC.
3 Các chuyên môn cần thiết trong Bảng 76 (22.1.1.1.1) chuyển đổi việc triển khai- bộ ký tự gốc được xác định. codecvt thực hiện một chuyển đổi thoái hóa; nó không chuyển đổi chút nào. Chuyên môn codecvt<char16_t, char, mbstate_t>
chuyển đổi giữa các lược đồ mã hóa UTF-16 và UTF-8, và chuyên môn codecvt <char32_t, char, mbstate_t>
chuyển đổi giữa các lược đồ mã hóa UTF-32 và UTF-8. codecvt<wchar_t,char,mbstate_t>
chuyển đổi giữa các bộ ký tự gốc cho các ký tự hẹp và rộng. Chuyên môn trên mbstate_t
thực hiện chuyển đổi giữa các mã hóa được biết đến với trình triển khai thư viện.
Các mã hóa khác có thể được chuyển đổi bằng cách chuyên về loại trạng thái do người dùng định nghĩa. Đối tượng stateT có thể chứa bất kỳ trạng thái nào hữu ích để giao tiếp với hoặc từ các thành viên do_in hoặc do_out chuyên dụng.
Các điều về wchar_t
là nó không cung cấp cho bạn bất kỳ đảm bảo về mã hóa được sử dụng. Nó là một kiểu có thể chứa ký tự nhiều byte. Giai đoạn. Nếu bạn định viết phần mềm bây giờ, bạn phải sống với sự thỏa hiệp này. Trình biên dịch tuân thủ C++ 0x vẫn còn rất xa. Bạn luôn có thể cung cấp cho các trình biên dịch CTP và g ++ VC2010 một thử cho những gì nó có giá trị. Hơn nữa, wchar_t
có kích thước khác nhau trên các nền tảng khác nhau mà là một điều cần xem ra cho (2 byte trên VS/Windows, 4 byte trên GCC/Mac và vv). Sau đó có các tùy chọn như -fshort-wchar
cho GCC để làm phức tạp thêm vấn đề.
Giải pháp tốt nhất là sử dụng thư viện hiện có. Theo đuổi các lỗi UNICODE xung quanh không phải là cách sử dụng tốt nhất của nỗ lực/thời gian. Tôi muốn đề nghị bạn hãy xem tại địa chỉ:
Thông tin thêm về C++ 0x Unicode xâu GNU libiconv
IBM here
Một câu hỏi khác có lẽ là điều tốt nhất. – dalle
@chmike: Thiếu hỗ trợ lambda trong 08 khiến tôi không nhìn xa hơn nữa. Tuy nhiên, tôi có thể xem xét mức độ tương thích C++ 0x trong VS2008 (tôi có Pro). Không phải là một dự án nguồn mở tốt nhất được hỗ trợ bởi một trình biên dịch mã nguồn mở? Chỉ cần tò mò (ngay cả khi 08 thể hiện edn là miễn phí). Vui lòng hỏi thêm! – dirkgently
@dirkgently Tôi đang cố gắng để làm cho các gói làm việc với VC08, g + + và sau đó với icc. Nó buộc tôi phải tuân theo tiêu chuẩn. Nỗ lực này đã giúp tôi tìm ra một số lỗi mà trình biên dịch không phát hiện được. Một số nơi được phát hiện bởi g ++ và những người khác bằng VC08. – chmike