Используйте тот факт, что строка на самом деле является шаблоном.
typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > tstring;
Затем используйте tstring str (_T ("Hello world"));
tstring sub = str.substr(6, 3 );
К сожалению, нетэто не tcout, если вы не #define это где-то:
#ifdef _UNICODE
#define tcout wcout
#else
#define tcout cout
#endif
Теперь я могу напечатать свою строку
tcout << sub << static_cast<TCHAR>('\n');
Обратите внимание, что в общем коде, как это становится очень грязным, и часто приводит когромный вздор.