在 MFC C++ 中将 char 数组转换为 UNICODE

Posted

技术标签:

【中文标题】在 MFC C++ 中将 char 数组转换为 UNICODE【英文标题】:Convert char array to UNICODE in MFC C++ 【发布时间】:2010-05-29 13:59:10 【问题描述】:

我正在使用以下代码从 Windows 中的文件夹中读取文件。但是,由于这是一个 MFC 应用程序,我必须将 char 数组转换为 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);

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

【问题讨论】:

【参考方案1】:

非常感谢您的所有回复。我从这些答案中学到了很多,因为我对下面发生的事情也不太了解。同时,我通过简单地使用以下代码转换为 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); 

【讨论】:

你也可以使用CString进行转换,它提供了几个方便的转换功能,如果你使用MFC(或者ATL),一般推荐使用。【参考方案2】:

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

【讨论】:

【参考方案3】:

您的问题混淆了几个问题。首先,使用MFC并不意味着你必须将字符数组转换为Unicode,一个与另一个无关。此外,FindFirstFile 是 Win32 API,而不是 MFC 函数。最后,_T("abc") 不一定是 unicode,而 _T(X) 是一个宏,在多字节构建中扩展为 X,在 unicode 构建中扩展为 L X,创建一个宽字符文字。这样做的目的是让您的代码可以在 unciode 或多字节配置中编译。为了在声明变量时获得同样的灵活性,您可以使用TCHAR 类型而不是charwchar_t。所以你的第二个 sn-p 应该看起来像

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

注意没有_T 宏,它只适用于字符串文字,不适用于标识符。

【讨论】:

【参考方案4】:

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

并非如此。如果您愿意,可以使用 change 来使用多字节字符集。

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

现在可以了

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

假设您想使用 UNICODE(Visual Studio 的名称,用于 Windows 原生 UNICODE 字符的 2 字节编码),那么您必须显式调用 API 的 MBCS 版本

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

【讨论】:

-1 使用多字节字符集暗示 UTF-8。这意味着使用用户为非 Unicode 程序的代码页设置的任何代码页。 @Logan Capaldo 好点。编辑答案让 WINAPI 照顾转换 -1 已删除。这只是一个更好的词,以前非常不准确。

以上是关于在 MFC C++ 中将 char 数组转换为 UNICODE的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将字符串转换为 char 数组?

在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short

如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?

在 C 和 C++ 中将 int 值转换为 char 指针差异

在 C 和 C++ 中将 char 转换为 int

如何在 C++ 中将 LPOLESTR 转换为 char*