Sascha'ya katılıyorum. TCHAR
/ _T()
/ Vb .'nin temel dayanağı, "ANSI" tabanlı bir uygulama yazabilmeniz ve ardından bir makro tanımlayarak sihirli bir şekilde ona Unicode desteği verebilmenizdir. Ancak bu, birkaç kötü varsayıma dayanmaktadır:
Yazılımınızın hem MBCS hem de Unicode sürümlerini aktif olarak oluşturduğunuz
Aksi takdirde, olacak kadar kayma ve sıradan kullanmak char*
birçok yerde dizeleri.
_T ("...") değişmez değerlerinde ASCII olmayan ters eğik çizgi kaçışları kullanmadığınız
"ANSI" kodlamanız ISO-8859-1 olmadıkça, sonuç char*
ve wchar_t*
değişmez değerler aynı karakterleri temsil etmeyecektir.
UTF-16 dizelerinin tıpkı "ANSI" dizeleri gibi kullanıldığı
Onlar değil. Unicode, çoğu eski karakter kodlamasında bulunmayan birkaç kavram sunar. Suretler. Karakterleri birleştirmek. Normalleştirme. Koşullu ve dile duyarlı büyük / küçük harf kuralları.
Ve belki de en önemlisi, UTF-16'nın nadiren diske kaydedilmesi veya İnternet üzerinden gönderilmesi gerçeği: UTF-8 harici gösterim için tercih edilme eğilimindedir.
Uygulamanızın İnternet'i kullanmadığını
(Şimdi, bunun için geçerli bir varsayım olabilir senin ... yazılım, ama)
Web, UTF-8 ve çok sayıda nadir kodlamayla çalışır . TCHAR
Kavram sadece iki tanır: ( "ANSI" olamaz UTF-8 olmak ) ve "Unicode" (UTF-16). Windows API çağrılarınızın Unicode duyarlı olmasını sağlamak için yararlı olabilir, ancak web ve e-posta uygulamalarınızı Unicode duyarlı hale getirmek için kesinlikle yararsızdır.
Microsoft'a ait olmayan kitaplıklar kullanmadığınız
Başka kimse kullanmıyor TCHAR
. Poco kullanır std::string
ve UTF-8. SQLite , API'sinin UTF-8 ve UTF-16 sürümlerine sahiptir, ancak yoktur TCHAR
. TCHAR
standart kitaplıkta bile değildir, bu yüzden std::tcout
kendiniz tanımlamak istemediğiniz sürece hayır .
TCHAR yerine ne öneririm
Geçerli UTF-8 olmayan bir dosyayı okumanız gerektiği durumlar dışında "ANSI" kodlamalarının var olduğunu unutun. Siz TCHAR
de unutun . Her zaman Windows API işlevlerinin "W" sürümünü çağırın. #define _UNICODE
sadece yanlışlıkla "A" işlevini çağırmadığınızdan emin olmak için.
Dizeler için her zaman UTF kodlamalarını kullanın: dizeler için UTF-8 ve char
dizeler için UTF-16 (Windows'ta) veya UTF-32 (Unix benzeri sistemlerde) wchar_t
. typedef
UTF16
ve UTF32
platform farklılıklarından kaçınmak için karakter türleri.