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 . TCHAR
Koncepcja 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::string
i UTF-8. SQLite ma wersje UTF-8 i UTF-16 swojego API, ale nie TCHAR
. TCHAR
nie ma go nawet w standardowej bibliotece, więc nie, std::tcout
chyba ż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 _UNICODE
tylko 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
UTF16
i UTF32
typy postaci, aby uniknąć różnic między platformami.