Конвертировать массив символов в UNICODE в MFC C ++ - PullRequest
0 голосов
/ 29 мая 2010

Я использую следующий код для чтения файлов из папки в Windows. Однако, так как это приложение MFC, я должен преобразовать массив символов в UNICODE. Например, если я жестко закодировал путь как «C: \ images3 \ test \», как показано ниже, код работает.


WIN32_FIND_DATA FindFileData;  
HANDLE hFind = INVALID_HANDLE_VALUE;  
hFind = FindFirstFile(_T("C:\\images3\\test\\"), &FindFileData);

Я хочу, чтобы это работало следующим образом:


char* pathOfFileType;  
hFind = FindFirstFile(_T(pathOfFileType), &FindFileData);

Может кто-нибудь сказать мне, как решить эту проблему?
Спасибо

Ответы [ 4 ]

1 голос
/ 29 мая 2010

Большое спасибо за все ваши ответы. Я многому научился из этих ответов, потому что у меня также не было большого представления о том, что происходит внизу. Тем временем мне удалось избавиться от этой проблемы, просто перейдя в UNICODE, используя следующий код с минимальными изменениями в моем существующем коде.

#include <atlconv.h>

USES_CONVERSION;

//An ANSI string
LPSTR lpsz_ANSI_String = pathOfFileType;

//ANSI string being converted to a UNICODE string
LPWSTR lpUnicodeStr = A2W( lpsz_ANSI_String );

hFind = FindFirstFile(lpUnicodeStr, &FindFileData); 
0 голосов
/ 29 мая 2010

", поскольку в этом приложении MFC у меня есть для преобразования массива символов в UNICODE"

Не так. Если вы хотите, вы можете использовать изменения, чтобы использовать многобайтовый набор символов.

В свойствах проекта общее изменение набора символов на «Использовать многобайтовый набор символов»

Теперь это будет работать

char* pathOfFileType;  
hFind = FindFirstFile(pathOfFileType, &FindFileData);

Предположим, что вы хотите использовать UNICODE (имя visual studio для 2-байтовой кодировки символов UNICODE, встроенных в Windows), тогда вам нужно явно вызвать версию API MBCS

char* pathOfFileType;  
hFind = FindFirstFileA(pathOfFileType, &FindFileData);
0 голосов
/ 29 мая 2010

Ваш вопрос демонстрирует смешение нескольких вопросов. Во-первых, использование MFC не означает, что вам нужно конвертировать массив символов в Unicode, один не имеет ничего общего с другим. Кроме того, FindFirstFile - это Win32 API, а не функция MFC. Наконец, _T("abc") не обязательно является Unicode, скорее _T(X) - это макрос, который в многобайтовых сборках расширяется до X , а в сборках Unicode расширяется до L X , создавая широкий буквальный характер. Это сделано для того, чтобы ваш код мог компилироваться в конфигурации unciode или multi-byte. Чтобы добиться такой же гибкости при объявлении переменной, вы используете тип TCHAR вместо char или wchar_t. Итак, ваш второй фрагмент должен выглядеть как

 TCHAR* pathOfFileType;  
 hFind = FindFirstFile(pathOfFileType, &FindFileData);

Примечание: не _T макрос, который применяется только к строковым литералам, а не к идентификаторам.

0 голосов
/ 29 мая 2010

Вы можете использовать функцию MultiByteToWideChar , чтобы преобразовать строку из char s в UTF-16, но вам лучше получить pathOfFileType непосредственно в Юникоде от пользователя или откуда угодно. это, в противном случае у вас могут возникнуть проблемы с путями, которые содержат символы, не включенные в текущий CP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...