我最近在研究sdl_image与stb_image这两个图片库,用于给vulkan传递图片。
中文路径会加载失败返回NULL
C++中字符串可以用char*来表示,也可以用wchar_t来表示。
由于中文字符占两个字节(不确定对不对),所以中文推荐采用wchar_t。
不过有时候我们用到某个库时只能传递char*所以需要转换一下:
- wchar_t* file = L"你好";
- char* new_file;
- int iSize = WideCharToMultiByte(CP_ACP, 0, file, -1, NULL, 0, NULL, NULL);
- new_file = (char*)malloc((iSize+1));
- WideCharToMultiByte(65001 /*CP_UTF8*/, 0, file, -1, new_file, iSize, NULL, NULL);
注意:wchar_t的字符串要加大写L。
以上这个操作是将unicode编码的wchar_t转为了char的utf8,至于能不能使用则需要看情况。
因为有可能你的char本身就是unicode编码,虽然打断点看到乱码字符但是能用。这个编码转换还需要加深理解。
无用拓展:我使用的pybind11就会自动将py的字符串转到c++的char或wchar_t或std::string上,配合上述的转换可以解决很多中文路径问题。
这个库支持读写图片以及加载字体,非常小巧。
网上一般都是用的stbi_load函数,需要传递文件路径。
我用的是stbi_load_from_file函数来加载图片,功能一样只不过需要自己加载文件传递FILE指针
可以看到我为了使用中文,采用了unicode编码的wchar_t字符串路径。
并且使用_wfopen来得到文件指针并传递给stb_image库。
这个库依赖于sdl2,同样可以加载图片并且功能更加强大,里面默认集成了上述stb_image库
这里我采用了unicode编码的char*字符串路径,经过测试我如果传递utf8编码的char*字符串会失败返回NULL。
同时由于API限制也不能愉快的传递wchar_t字符串,所以只能这样了,好在我使用的pybind11能自动帮我转换好,节省了大量时间。