Я должен согласиться с Сашей. Основная предпосылка TCHAR/ _T()/ и т. Д. Состоит в том, что вы можете написать приложение на основе "ANSI", а затем волшебным образом предоставить ему поддержку Unicode, определив макрос. Но это основано на нескольких неверных предположениях:
Что вы активно создаете версии своего программного обеспечения как MBCS, так и Unicode.
В противном случае вы ошибетесь и будете использовать обычные char*струны во многих местах.
Что вы не используете символы обратной косой черты, отличные от ASCII, в литералах _T ("...")
Если ваша кодировка "ANSI" не соответствует ISO-8859-1, результирующие char*и wchar_t*литералы не будут представлять одни и те же символы.
Эти строки UTF-16 используются так же, как строки ANSI.
Они не. Unicode вводит несколько концепций, которых нет в большинстве устаревших кодировок символов. Суррогаты. Объединение персонажей. Нормализация. Условные и зависящие от языка правила регистра.
И, возможно, самое главное, тот факт, что 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просто чтобы убедиться, что вы случайно не вызываете функцию «А».
Всегда используйте кодировки UTF для строк: UTF-8 для charстрок и UTF-16 (в Windows) или UTF-32 (в Unix-подобных системах) для wchar_tстрок. typedef UTF16и UTF32типы символов, чтобы избежать различий в платформах.