MFC(unicode):如何将 wstring 文件路径转换为字符串路径?

MFC(unicode): how do i convert a wstring filepath to a string path?

我有一个使用 MFC、C++ 创建并使用 Unicode 的应用程序。

我必须使用 wstring 文件路径加载纹理。这个 wstring 文件路径是系统给的,我不需要在任何地方显示它。我只需要将它传递给纹理加载方法。不幸的是,纹理加载方法(来自库)仅采用字符串文件路径。如下所示:

wstring wstringPath = L"abc路徑";// how do I convert it to a string path to used in the following method
stbi_load(stringPath, &width, &height, &nrChannels, 0); //texture loading method

我搜索了很多,但没有找到解决问题的好答案(或太复杂)。有人可以帮忙吗?

我试过但没有用的东西:

size_t len = wcslen(wstringPath .c_str()) + 1;

size_t newLen = len * 2;
char* newPath = new char[newLen];

wcstombs(newPath, wstringPath .c_str(), sizeof(newPath));

glGenTextures(1, &m_textureID);

int width, height, nrComponents;
unsigned char *data = stbi_load(newPath, &width, &height, &nrComponents, 0);

您可以使用(仅限 MS Windows)函数 WideCharToMultiByte。您可以将目标的代码页设置为 CP_ACP.

我查看了 API stbi_load 文件名似乎需要 const char*

在那种情况下,最懒惰和最好的方法是使用 CString 类.

#include <atlstr.h> // might not need if you already have MFC stuff included

CStringA filePathA(wstringPath.c_str()); // it converts using CP_THREAD_ACP

stbi_load(filePathA, ....); // automatically casts to LPCSTR (const char*)

=========================================== ====

由于有新的信息需要使用UTF-8来调用那些APIS,可能需要这样的函数:

CStringA GetUtf8String(LPCWSTR lpwz)
{
    CStringA strRet;

    if (lpwz == nullptr || (*lpwz == 0))
        return strRet;

    int len = WideCharToMultiByte(CP_UTF8, 0, lpwz, -1, NULL, 0, NULL, NULL);

    WideCharToMultiByte(CP_UTF8, 0, lpwz, -1, strRet.GetBufferSetLength(len), len, NULL, NULL);

    strRet.ReleaseBuffer();

    return strRet;
}

然后你会这样称呼它:

wstring wstringPath = L"abc路徑";
stbi_load(GetUtf8String(wstringPath.c_str()), blah, blah, blah);