Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В общем, символ строки может быть представлен в виде 1-го байта и 2-х байтов.
Обычно одно-байтовый символ это символ кодировки ANSI-
А 2-х байтовый символ это кодировка UNICODE
Для представления 2-х байтовой кодировки Юникод Microsoft Windows использует UTF16-кодирование.
Строка Unicode длиной 7 символов будет занимать 14 байтов. Если строка Unicode занимает 15 байтов то это не правильная строка, и она не будет работать в любом контексте.
Также, строка будет кратна размеру sizeof(TCHAR) в байтах.
Вы путаете кодировку UTF-16, в которой каждый символ 2 байта, с UTF-8, где символ занимает от 1 до 4х байт.
И в windows под UNICODE понимается UTF-16
вы даже не сможете открыть файл с юникодным именем под виндой.
//Юникод включен
TCHAR* FileName;
USES_CONVERSION;
char* FNAME = T2A( FileName);
ifstream TargetFile(FNAME,ios::in | ios::binary);
basic_filebuf<Elem, Tr> *open(
const char *_Filename,
ios_base::openmode _Mode,
int _Prot = (int)ios_base::_Openprot
);
basic_filebuf<Elem, Tr> *open(
const char *_Filename,
ios_base::openmode _Mode
);
basic_filebuf<Elem, Tr> *open(
const wchar_t *_Filename,
ios_base::openmode _Mode,
int _Prot = (int)ios_base::_Openprot
);
basic_filebuf<Elem, Tr> *open(
const wchar_t *_Filename,
ios_base::openmode _Mode
);
template <class charT, class traits = char_traits<charT> >
class basic_ofstream;
typedef basic_ofstream<char> ofstream;
typedef basic_ofstream<wchar_t> wofstream;
wchar_t name[] = L"Гав-Гав.txt";
std::fstream file(name); //ну флаги там по вкусу

Приведите компилятор и платформу где не реально будет юникод имена использовать для стандартной библиотеки ??? в частности для ifstream!!!
Ты смотри как выкрутилось всё — начали с наезда на винду, дескать не открыть там файлик юникодный, а закончилось пенянием на то что канонически GCC такого не умеет.
TCHAR, WCHAR, LPSTR, LPWSTR,LPCTSTR.
Что такое TCHAR, WCHAR, LPSTR, LPWSTR,LPCTSTR (итд)