Muszę się zgodzić z Saschą. Podstawowym założeniem TCHAR/ _T()/ etc. jest to, że możesz napisać aplikację opartą na "ANSI", a następnie w magiczny sposób nadać jej obsługę Unicode poprzez zdefiniowanie makra. Ale opiera się to na kilku złych założeniach:
Aktywnie budujesz oprogramowanie w wersji MBCS i Unicode
W przeciwnym razie będą ślizgać się i używać zwykłych char*ciągów w wielu miejscach.
Że w literałach _T ("...") nie używasz znaków z ukośnikiem odwrotnym spoza ASCII
O ile Twoim kodowaniem „ANSI” nie jest ISO-8859-1, wynikowe char*i wchar_t*literały nie będą reprezentować tych samych znaków.
Te ciągi UTF-16 są używane tak jak ciągi „ANSI”
Oni nie są. Unicode wprowadza kilka koncepcji, które nie istnieją w większości starszych kodowań znaków. Surogaty. Łączenie znaków. Normalizacja. Reguły wielkości liter warunkowych i zależnych od języka.
I być może najważniejsze, fakt, że UTF-16 rzadko jest zapisywany na dysku lub przesyłany przez Internet: UTF-8 jest preferowany do reprezentacji zewnętrznej.
Twoja aplikacja nie korzysta z Internetu
(To może być prawidłowe założenie dla twojego oprogramowania, ale ...)
Sieć działa na UTF-8 i wielu rzadszych kodowaniach . TCHARKoncepcja uznaje tylko dwa: "ANSI" (które nie mogą być UTF-8 ) i "Unicode" (UTF-16). Może to być przydatne do wykonywania wywołań interfejsu API systemu Windows z obsługą Unicode, ale jest cholernie bezużyteczne, aby aplikacje internetowe i e-mailowe obsługiwały Unicode.
Że nie używasz bibliotek innych niż Microsoft
Nikt inny nie używa TCHAR. Poco używa std::stringi UTF-8. SQLite ma wersje UTF-8 i UTF-16 swojego API, ale nie TCHAR. TCHARnie ma go nawet w standardowej bibliotece, więc nie, std::tcoutchyba że chcesz to zdefiniować samodzielnie.
Co polecam zamiast TCHAR
Zapomnij, że istnieją kodowania „ANSI”, z wyjątkiem sytuacji, gdy musisz odczytać plik, który nie jest prawidłowym UTF-8. Zapomnij o tym TCHAR. Zawsze wywołuj wersję „W” funkcji Windows API. #define _UNICODEtylko po to, aby upewnić się, że przypadkowo nie wywołasz funkcji „A”.
Zawsze używaj kodowania UTF dla łańcuchów: UTF-8 dla charłańcuchów i UTF-16 (w systemie Windows) lub UTF-32 (w systemach typu Unix) dla wchar_tłańcuchów. typedef UTF16i UTF32typy postaci, aby uniknąć różnic między platformami.