Я должен согласиться с Сашей. Исходная предпосылка TCHAR
/ _T()
/ и т. Д. Заключается в том, что вы можете написать приложение на основе «ANSI» и затем волшебным образом дать ему поддержку Unicode, определив макрос. Но это основано на нескольких неправильных предположениях:
что вы активно создаете версии программного обеспечения для MBCS и Unicode
В противном случае вы будете проскальзывать и использовать обычные строки char*
во многих местах.
То, что вы не используете экранирование без обратной ASCII в литералах _T ("...")
Если ваша кодировка "ANSI" не соответствует ISO-8859-1, результирующие литералы char*
и wchar_t*
не будут представлять одинаковые символы.
что строки UTF-16 используются так же, как строки "ANSI"
Это не так. Юникод вводит несколько концепций, которых нет в большинстве устаревших кодировок символов. Суррогаты. Сочетание персонажей. Нормализация. Условные и языковые правила обсадных труб.
И, возможно, самое главное, тот факт, что UTF-16 редко сохраняется на диске или отправляется через Интернет: UTF-8 имеет тенденцию быть предпочтительным для внешнего представления.
То, что ваше приложение не использует Интернет
(Теперь это может быть верным предположением для вашего программного обеспечения, но ...)
Сеть работает на UTF-8 и множестве более редких кодировок . Концепция TCHAR
распознает только два: «ANSI» (который не может быть UTF-8 ) и «Unicode» (UTF-16). Это может быть полезно для того, чтобы ваши вызовы Windows API поддерживали Unicode, но чертовски бесполезны для того, чтобы сделать ваши веб-приложения и почтовые приложения поддерживающими Unicode.
То, что вы не используете библиотеки сторонних разработчиков
Никто другой не использует TCHAR
. Poco использует std::string
и UTF-8. SQLite имеет версии API UTF-8 и UTF-16, но не TCHAR
. TCHAR
нет даже в стандартной библиотеке, поэтому нет std::tcout
, если вы не хотите определить его самостоятельно.
Что я рекомендую вместо TCHAR
Забудьте, что существуют кодировки «ANSI», за исключением случаев, когда вам нужно прочитать файл, который не является допустимым UTF-8. Забудьте о TCHAR
тоже. Всегда вызывайте "W" версию функций Windows API. #define _UNICODE
просто чтобы убедиться, что вы случайно не вызвали функцию "A".
Всегда используйте кодировки UTF для строк: UTF-8 для строк char
и UTF-16 (в Windows) или UTF-32 (в Unix-подобных системах) для строк wchar_t
. typedef
UTF16
и UTF32
типы символов, чтобы избежать различий между платформами.