Saya harus setuju dengan Sascha. Premis yang mendasari TCHAR
/_T()
/ etc. adalah Anda dapat menulis aplikasi berbasis "ANSI" dan kemudian secara ajaib memberinya dukungan Unicode dengan mendefinisikan makro. Tetapi ini didasarkan pada beberapa asumsi buruk:
Bahwa Anda secara aktif membangun versi MBCS dan Unicode dari perangkat lunak Anda
Jika tidak, Anda akan tergelincir dan menggunakan biasachar*
string di banyak tempat.
Bahwa Anda tidak menggunakan pelolosan garis miring terbalik non-ASCII dalam literal _T ("...")
Kecuali pengkodean "ANSI" Anda kebetulan ISO-8859-1, hasil char*
dan wchar_t*
literal tidak akan mewakili karakter yang sama.
String UTF-16 tersebut digunakan seperti string "ANSI"
Mereka tidak. Unicode memperkenalkan beberapa konsep yang tidak ada di sebagian besar pengkodean karakter lama. Pengganti. Menggabungkan karakter. Normalisasi. Aturan kapitalisasi bersyarat dan peka bahasa.
Dan mungkin yang paling penting, fakta bahwa UTF-16 jarang disimpan di disk atau dikirim melalui Internet: UTF-8 cenderung lebih disukai untuk representasi eksternal.
Bahwa aplikasi Anda tidak menggunakan Internet
(Sekarang, ini mungkin asumsi yang valid untuk Anda perangkat lunak , tetapi ...)
Web berjalan pada UTF-8 dan sejumlah besar pengkodean yang lebih jarang . The TCHAR
Konsep hanya mengakui dua: "ANSI" (yang tidak bisa menjadi UTF-8 ) dan "Unicode" (UTF-16). Ini mungkin berguna untuk membuat panggilan Windows API Anda sadar-Unicode, tetapi itu sangat tidak berguna untuk membuat aplikasi web dan email Anda sadar-Unicode.
Bahwa Anda tidak menggunakan perpustakaan non-Microsoft
Tidak ada orang lain yang menggunakan TCHAR
. Poco menggunakan std::string
dan UTF-8. SQLite memiliki API versi UTF-8 dan UTF-16, tetapi tidak TCHAR
. TCHAR
bahkan tidak ada di pustaka standar, jadi tidak, std::tcout
kecuali Anda ingin mendefinisikannya sendiri.
Yang saya rekomendasikan, bukan TCHAR
Lupakan bahwa pengkodean "ANSI" ada, kecuali saat Anda perlu membaca file yang bukan UTF-8 yang valid. Lupakan TCHAR
juga. Selalu panggil fungsi Windows API versi "W". #define _UNICODE
hanya untuk memastikan Anda tidak memanggil fungsi "A" secara tidak sengaja.
Selalu gunakan encoding UTF untuk string: UTF-8 untuk char
string dan UTF-16 (di Windows) atau UTF-32 (pada sistem mirip Unix) untuk wchar_t
string. typedef
UTF16
dan UTF32
tipe karakter untuk menghindari perbedaan platform.