在 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 函数将字符串从char
s 转换为UTF-16,但您最好直接从用户或您获取的任何地方以Unicode 格式获取pathOfFileType
,否则您包含当前 CP 中未包含的字符的路径可能仍会遇到问题。
【讨论】:
【参考方案3】:您的问题混淆了几个问题。首先,使用MFC并不意味着你必须将字符数组转换为Unicode,一个与另一个无关。此外,FindFirstFile
是 Win32 API,而不是 MFC 函数。最后,_T("abc")
不一定是 unicode,而 _T(X)
是一个宏,在多字节构建中扩展为 X,在 unicode 构建中扩展为 L X,创建一个宽字符文字。这样做的目的是让您的代码可以在 unciode 或多字节配置中编译。为了在声明变量时获得同样的灵活性,您可以使用TCHAR
类型而不是char
或wchar_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++ 中将 unsigned char (byte) 数组转换为 unsigned short
如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?