В каких случая нужно использова char а в каких wchar_t

Возник вопрос между использованием char и wchar_t. Сначала я создал программу

#include <windows.h>
#include <shlobj.h>
#include <stdio.h>

int main()
{
    char* ptr = new char[MAX_PATH];
    memset(ptr, 0, MAX_PATH);
    if(SHGetFolderPathA(0, CSIDL_LOCAL_APPDATA, 0, 0, ptr) == S_OK)
    {
        lstrcatA(ptr, "\\FolderName");
        if(CreateDirectoryA(ptr, 0))
        {
            printf("ok\n");
        }
    }
    delete[] ptr;
    system("pause");
}

И запустил её на Windows 10 полностью английской версии. Всё сработало отлично и папка FolderName как и ожидалось создалась. Затем я подумал что если запустить эту программу на ОС в которой имя пользователя будет на другом языке(не английском) то программа не сработает и нужно будет использовать wchar_t. Но когда я запустил программу на ОС в который имя пользователя было Валерий программа сработала и папка создалась. Отсюда у меня возник вопрос в каких случая нужно использовать wchar_t если и с char всё работает?


Ответы (1 шт):

Автор решения: Alex Guteniev

whar_t в Windows API когда-то были UCS-2, теперь они UTF-16. Это всегда Unicode.

char могут соотвествовать какой-либо кодировке. С относительно недавних пор (2019) эта кодировка может быть UTF-8, ранее это всегда была не-Unicode кодировка.

TCHAR -- позволяет условную компиляцию с char или wchar_t.

Windows внутри переводит из char в wchar_t, некоторые функции есть только для wchar_t, весь COM использует wchar_t.

Зачем тогда иметь дело с char, если с wchar_t имеем Unicode, а с char - проблемы с кодировками? Возможные причины:

  • Когда-то были системы Windows 9x, там wchar_t функции не были реализованы. Системы уже никем не поддерживаются, но остался код, который всё ещё не перенесен на wchar_t
  • char используется в других ОС, т.е. для универсальности.
  • char используется в библиотеках, даже в самом C++ std::exception::what возвращает char
→ Ссылка