Tôi phải đồng ý với Sascha. Tiền đề cơ bản của TCHAR
/ _T()
/ v.v. là bạn có thể viết một ứng dụng dựa trên "ANSI" và sau đó cung cấp cho nó hỗ trợ Unicode một cách kỳ diệu bằng cách xác định một macro. Nhưng điều này dựa trên một số giả định xấu:
Rằng bạn tích cực xây dựng cả phiên bản MBCS và Unicode cho phần mềm của mình
Nếu không, bạn sẽ trượt lên và sử dụng char*
dây thông thường ở nhiều nơi.
Việc bạn không sử dụng dấu gạch chéo ngược không phải ASCII sẽ thoát ra trong _T ("...") ký tự
Trừ khi mã hóa "ANSI" của bạn là ISO-8859-1, kết quả char*
và các wchar_t*
ký tự sẽ không đại diện cho các ký tự giống nhau.
Chuỗi UTF-16 đó được sử dụng giống như chuỗi "ANSI"
Không phải vậy. Unicode giới thiệu một số khái niệm không tồn tại trong hầu hết các bảng mã ký tự cũ. Người đẻ thuê. Kết hợp các ký tự. Bình thường hóa. Quy tắc viết hoa có điều kiện và ngôn ngữ nhạy cảm.
Và có lẽ quan trọng nhất, thực tế là UTF-16 hiếm khi được lưu trên đĩa hoặc được gửi qua Internet: UTF-8 có xu hướng được ưu tiên hơn để biểu diễn bên ngoài.
Rằng ứng dụng của bạn không sử dụng Internet
(Bây giờ, đây có thể là một giả định hợp lệ cho phần mềm của bạn , nhưng ...)
Web chạy trên UTF-8 và rất nhiều mã hóa hiếm hơn . Các TCHAR
khái niệm chỉ công nhận hai: "ANSI" (mà không thể được UTF-8 ) và "Unicode" (UTF-16). Nó có thể hữu ích để làm cho các lệnh gọi API Windows của bạn nhận biết được Unicode, nhưng nó vô dụng khi làm cho các ứng dụng web và e-mail của bạn nhận biết được Unicode.
Mà bạn không sử dụng thư viện không phải của Microsoft
Không ai khác sử dụng TCHAR
. Poco sử dụng std::string
và UTF-8. SQLite có các phiên bản UTF-8 và UTF-16 của API của nó, nhưng không TCHAR
. TCHAR
thậm chí không có trong thư viện chuẩn, vì vậy không std::tcout
trừ khi bạn muốn tự mình xác định nó.
Những gì tôi đề xuất thay vì TCHAR
Quên rằng mã hóa "ANSI" tồn tại, ngoại trừ khi bạn cần đọc tệp không hợp lệ UTF-8. Quên về TCHAR
quá. Luôn gọi phiên bản "W" của các hàm API Windows. #define _UNICODE
chỉ để đảm bảo rằng bạn không vô tình gọi một hàm "A".
Luôn sử dụng mã hóa UTF cho chuỗi: UTF-8 cho char
chuỗi và UTF-16 (trên Windows) hoặc UTF-32 (trên hệ thống giống Unix) cho wchar_t
chuỗi. typedef
UTF16
và UTF32
các loại ký tự để tránh sự khác biệt về nền tảng.