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



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

我必须加载一个带有wstring文件路径的纹理。这个wstring文件路径是由系统提供的,我不需要在任何地方显示它。我只需要把它传递给一个纹理加载方法。不幸的是,纹理加载方法(从库(只采用字符串filePath。如下所示:

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);

我查看了APIstbi_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);

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

相关内容

  • 没有找到相关文章

最新更新