Я должен согласиться с Сашей. Основная предпосылка 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
типы символов, чтобы избежать различий в платформах.