【问题标题】:Convert char array to UNICODE in MFC C++在 MFC C++ 中将 char 数组转换为 UNICODE
【发布时间】: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);

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

【问题讨论】:

    标签: visual-c++ unicode mfc


    【解决方案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 已删除。这只是一个更好的词,以前非常不准确。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 2011-06-08
        • 2021-12-26
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 2012-04-29
        相关资源
        最近更新 更多