Я повинен погодитися з Сашею. Основна передумова 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.
Що ви не використовуєте бібліотеки, що не належать Microsoft
Більше ніхто не використовує 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
типи символів, щоб уникнути відмінностей на платформі.