Visual c++ 在MFC+中将字符数组转换为UNICODE+;

Visual c++ 在MFC+中将字符数组转换为UNICODE+;,visual-c++,unicode,mfc,Visual C++,Unicode,Mfc,我正在使用以下代码从windows中的文件夹中读取文件。但是,由于这是一个MFC应用程序,我必须将字符数组转换为UNICODE。例如,如果我将路径硬编码为“C:\images3\test\”,如下所示,代码可以工作 我想要的是让它按如下方式工作: 谁能告诉我如何解决这个问题吗? 感谢您可以使用该函数将字符串从chars转换为UTF-16,但您最好直接从用户处或从任何地方获取Unicode格式的pathoffielType,否则您可能仍然会遇到包含当前CP中未包含的字符的路径问题。“由于这

我正在使用以下代码从windows中的文件夹中读取文件。但是,由于这是一个MFC应用程序,我必须将字符数组转换为UNICODE。例如,如果我将路径硬编码为“C:\images3\test\”,如下所示,代码可以工作



我想要的是让它按如下方式工作:



谁能告诉我如何解决这个问题吗?
感谢

您可以使用该函数将字符串从
char
s转换为UTF-16,但您最好直接从用户处或从任何地方获取Unicode格式的
pathoffielType
,否则您可能仍然会遇到包含当前CP中未包含的字符的路径问题。

“由于这是一个MFC应用程序,我必须将字符数组转换为UNICODE”

不是这样。如果您愿意,可以使用change来使用多字节字符集

在项目属性中,常规将字符集更改为“使用多字节字符集”

现在这就行了

char* pathOfFileType;  
hFind = FindFirstFile(pathOfFileType, &FindFileData);
假设您想要使用UNICODE(Windows原生UNICODE字符的2字节编码的visual studio名称),那么您必须显式调用API的MBCS版本

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

您的问题显示了对几个问题的混淆。首先,使用MFC并不意味着您必须将字符数组转换为Unicode,一个与另一个无关。此外,
FindFirstFile
是Win32 API,而不是MFC函数。最后,
(“abc”)
不一定是Unicode,而是
\t(X)
是一个宏,它在多字节版本中扩展为X,在unicode版本中扩展为LX,从而创建宽字符文字。这是为了使您的代码可以在uncode或多字节配置中编译。要在声明变量时实现同样的灵活性,请使用
TCHAR
类型而不是
char
wchar\u t
。因此,您的第二个代码片段应该如下所示

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

注意:不
\u T
宏,它只适用于字符串文字,而不适用于标识符。

非常感谢您的所有回答。我从这些答案中学到了很多东西,因为我对下面发生的事情也不太了解。同时,我通过使用以下带有m的代码简单地转换为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); 
#包括
使用_转换;
//ANSI字符串
LPSTR lpsz_ANSI_String=pathoffieltype;
//正在转换为UNICODE字符串的ANSI字符串
LPWSTR LPUNICODEST=A2W(lpsz_ANSI_字符串);
hFind=FindFirstFile(lpUnicodeStr和FindFileData);

-1使用多字节字符集并不意味着UTF-8。它意味着使用用户为非Unicode程序的代码页设置的任何代码页。@Logan Capaldo的观点很好。编辑的答案让WINAPI在转换后查看-1被删除。它只是一个更好的词,以前不准确得很危险。您也可以使用CString来进行转换rsion,它提供了几个方便的转换函数,如果您正在使用MFC(或ATL),通常建议您使用它。
 TCHAR* pathOfFileType;  
 hFind = FindFirstFile(pathOfFileType, &FindFileData);
#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);