В каких случая нужно использова char а в каких wchar_t
И запустил её на Windows 10 полностью английской версии. Всё сработало отлично и папка FolderName как и ожидалось создалась. Затем я подумал что если запустить эту программу на ОС в которой имя пользователя будет на другом языке(не английском) то программа не сработает и нужно будет использовать wchar_t . Но когда я запустил программу на ОС в который имя пользователя было Валерий программа сработала и папка создалась. Отсюда у меня возник вопрос в каких случая нужно использовать wchar_t если и с char всё работает?
Отслеживать
28.5k 12 12 золотых знаков 59 59 серебряных знаков 118 118 бронзовых знаков
Char, TCHAR, wchar_t
1>d:\c++\lab1\lab1\main.cpp(54): error C2664: strcpy: невозможно преобразовать параметр 2 из «TCHAR *» в «const char *»
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>d:\c++\lab1\lab1\main.cpp(56): error C2664: strcat: невозможно преобразовать параметр 2 из «TCHAR *» в «const char *»
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>d:\c++\lab1\lab1\main.cpp(67): error C2664: CreateProcessW: невозможно преобразовать параметр 2 из «char [20]» в «LPWSTR»
1 2 3 4
char command[20]; strcpy(command, argv[1]); strcat(command, " "); strcat(command, argv[2]);
int _tmain( int argc, TCHAR *argv[] )
Кликните здесь для просмотра всего текста
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
#include #include #include /* time_t, struct tm, time, localtime, strftime */ #include #include #include using namespace std; #define VALUE_COUNT 20 int _tmain( int argc, TCHAR *argv[] ) { //------ pipe -------------------------------- HANDLE hReadPipe, hWritePipe; SECURITY_ATTRIBUTES PipeSA = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; CreatePipe(&hReadPipe, &hWritePipe, &PipeSA, 0); //-------------------------------------------- STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); si.hStdError = GetStdHandle(STD_ERROR_HANDLE); si.hStdOutput = hWritePipe; si.dwFlags = STARTF_USESTDHANDLES; if( argc != 3 ) { printf("Usage: lab1.exe [file_name] . Example: lab1.exe out.txt\n"); return 1; } //------------------------------------------------ ofstream file; file.open(argv[2], ios_base::out); //открываем файл int temp; cout "File content: " endl; for (int i = 0; i VALUE_COUNT; ++i) { //заполняем случайными значениями temp = rand() % 255; //случайные значения в диапозоне от 0 до 255 file temp " "; cout temp " "; } cout endl; file.close(); //закрываем файл // char command[20]; strcpy(command, argv[1]); strcat(command, " "); strcat(command, argv[2]); // Start the child process. if( !CreateProcess( NULL, // No module name (use command line) command, // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable TRUE, // Set handle inheritance to FALSE 0, //flag to create new console NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi ) // Pointer to PROCESS_INFORMATION structure ) { cout "CreateProcess failed " GetLastError() endl; return 1; } // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); DWORD dwRead; CHAR chBuf[80]; ReadFile(hReadPipe, chBuf, 80, &dwRead, NULL); chBuf[dwRead] = '\0'; cout "(GET FROM CHILD PROCESS) max: " chBuf endl; // Close pipe handles CloseHandle(hReadPipe); CloseHandle(hWritePipe); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); cout "press any key. " endl; getch(); return 0; }
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Взаимодействие char и TCHAR
Уважаемые форумчане, имеется следующая, вроде бы, тривиальная проблема: хочу перезаписать один.
Как перевести TCHAR в CHAR и обратно
Как преобразовать TCHAR в CHAR и обратно? Функцию какую-нибудь подскажите, а то с числами обход.
Wchar_t to char
я тут обнаружил любопытнейшую вещь, оказывается можно просто присваивать char = wchar_t и наоборот.
Преобразование wchar_t в char
Как преобразовать wchar_t в char ? Получаю wszName через MIB_IFTABLE.
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
saserlend, определитесь что вам нужно, юникод или ANSI. В проекте отключити поддержку юникода — и будет норм компилироваться( Solution explorer -> Select project -> Properties -> Configuration -> General -> Charecter set -> Not set)
Добавлено через 3 минуты
Или же, если требуется юникод — использовать функции работы с юникод-строками(wchar.h)
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
TCHAR это виндовский дефайн wchar_t, поэтому для их работы используй функции, начинающиеся на wcs.
Если, например, надо конвертнуть строку char в wchar_t используй функцию wcstombs и наоборот mbstowcs и прочее
В твоем случае
wchar_t command[20]; wcscpy(command, argv[1]
и так далее
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Сообщение от Вованя
TCHAR это виндовский дефайн wchar_t
Вообще-то, нет. Если в настройках проекта стоит «Use Unicode Character set», то TCHAR будет замещено wchar_t, а если стоит «Use Multi-byte character set», то будет замещено на char
Строки в C++, отличие char* и wchar_t*
Объясните кто-то — чем отличаются строки char* и wchar_t* ?
1)wchar_t* — это вроде как Unicode строка (sizeof(wchar_t) выдает 2 байта на символ) — этот тип строки «хавает» символы любого алфавита.
2)а вот char* — это что за строка (sizeof(char) выдает 1 байт на символ)? Multi-Byte строка что ли? В таком случае выходи тоже юникод, тогда какой — UTF7 или UTF8? Или же это вобще ASCII строка?
Но вот в VS в настройках проекта есть опция Character Set — которая меняет представление строк с Unicode на Multi-Byte — но каких строк, если wchar_t* и char* — это уже какие-то типы строк (вопросы в пунктах 1 и 2)?
wchar_t в винде — это подмножество уникода UCS-2 (с фиксированной длинной символов)
wchar_t в unix — это utf-32 и занимает соответственно 4 байта
в обычном чаре может быть как однобайтовая, так и мультибайтовая кодировка (utf-8)
Но вот в VS в настройках проекта есть опция Character Set — которая меняет представление строк с Unicode на Multi-Byte — но каких строк, если wchar_t* и char* — это уже какие-то типы строк (вопросы в пунктах 1 и 2)?
эта настройка в основном для WinAPI и оберток TCHAR, LPCTSTR etc
char — это знаковый 8 бит тип. Будет он хранить UTF7, UTF8, ANSI, ASCII или что-то еще это по барабану — это зависит от того, как интерпретировать данный.
Стандартное API Windows интерпретирует wchar_t как UCS2 (но ничего вам не мешает хранить там для себя что угодно в виде того же UTF16 скажем) а char как ANSI. Внутренне на всех NT базированных платформах все переводится в wchar_t/UCS2
Похожие статьи
- Вставка символа Unicode в RichEdit в Delphi 7
- char*. Как определить размер строки?
- Delphi 7 — скрытые возможности Unicode (WideString)
- Cчитать из файла Unicode строки
- Работа с BOM
- Представить русские символы в виде кода Unicode
- Перемещение символа стрелками
- Чтение и запись в файл в юникоде с помощью макросов в excel
- Win32 API. VS2008. Как создать приложение win32 в vs2008?
Чем отличается tchar от wchar
Профиль
Группа: Участник
Сообщений: 217
Регистрация: 7.11.2007
Репутация: 1
Всего: 3
Объясните пожалуйста чем отличаеться WCHAR от TCHAR и чем они оба отличаються от char. Я знаю что char и WCHAR это два разных набора символов. То есть в char используеться по- моему один байт для символа а в WCHAR несколько. А что такое TCHAR? И еще почему перед одной строкой символов надо ставить _T(«Hello All») а перед другой TEXT(«Hello All») а еще бывает и так L»Hello All».
Это сообщение отредактировал(а) kurlyak — 3.11.2009, 17:44
Дата 3.11.2009, 20:57 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир
Репутация: 6
Всего: 118
Цитата |
А что такое TCHAR? И еще почему перед одной строкой символов надо ставить _T(«Hello All») а перед другой TEXT(«Hello All») а еще бывает и так L»Hello All». |
макрос TEXT объявлен в WinNT.h, макрос _T объявлен в tchar.h. Cуть (и результат работы) одна и таже — сделать из строк L»text» в случае unicode проекта, и сделать «text» в обратном.
Цитата |
чем отличаеться WCHAR от TCHAR |
в случае задефайненого _UNICODE (иначе выставленного проекта как unicode) TCHAR превратится в char, иначе в wchar_t, WCHAR же останется wchar_t независимо от настроек. Это просто windows-specific типы. Используйте преумущественно TCHAR (чтобы скомпилировать ANSI версию уметь), впрочем на это можно забить — сейчас никому не нужны ANSI версии программ в винде.
sizeof(wchar_t)=2 в винде и представляет собой кодировку UCS-2 (юникод)
sizeof(char)=1 в винде и представляет собой ANSI кодировку
(если речь идет о символах, а не о числах).