• SDL_Image STB_Image 中文路径


    引言

    我最近在研究sdl_image与stb_image这两个图片库,用于给vulkan传递图片。

    中文路径会加载失败返回NULL

    介绍字符串

    C++中字符串可以用char*来表示,也可以用wchar_t来表示。

    由于中文字符占两个字节(不确定对不对),所以中文推荐采用wchar_t。

    不过有时候我们用到某个库时只能传递char*所以需要转换一下:

    1. wchar_t* file = L"你好";
    2. char* new_file;
    3. int iSize = WideCharToMultiByte(CP_ACP, 0, file, -1, NULL, 0, NULL, NULL);
    4. new_file = (char*)malloc((iSize+1));
    5. WideCharToMultiByte(65001 /*CP_UTF8*/, 0, file, -1, new_file, iSize, NULL, NULL);

    注意:wchar_t的字符串要加大写L。

    拓展:wchar_t - 百度百科

    以上这个操作是将unicode编码的wchar_t转为了char的utf8,至于能不能使用则需要看情况。

    因为有可能你的char本身就是unicode编码,虽然打断点看到乱码字符但是能用。这个编码转换还需要加深理解。

    无用拓展:我使用的pybind11就会自动将py的字符串转到c++的char或wchar_t或std::string上,配合上述的转换可以解决很多中文路径问题。

    介绍STB_Image

    这个库支持读写图片以及加载字体,非常小巧。

    网上一般都是用的stbi_load函数,需要传递文件路径。

    我用的是stbi_load_from_file函数来加载图片,功能一样只不过需要自己加载文件传递FILE指针

     可以看到我为了使用中文,采用了unicode编码的wchar_t字符串路径。

    并且使用_wfopen来得到文件指针并传递给stb_image库。

    介绍SDL_Image

    这个库依赖于sdl2,同样可以加载图片并且功能更加强大,里面默认集成了上述stb_image库

     这里我采用了unicode编码的char*字符串路径,经过测试我如果传递utf8编码的char*字符串会失败返回NULL。

    同时由于API限制也不能愉快的传递wchar_t字符串,所以只能这样了,好在我使用的pybind11能自动帮我转换好,节省了大量时间。

  • 相关阅读:
    mysql学习笔记--单张表上的增删改查
    Jenkins Jenkinsfile管理 Pipeline script from SCM
    用html编写的小广告板
    ShardingJDBC配置读写分离
    Keras深度学习实战(35)——构建机器翻译模型
    大模型全情投入,低代码也越来越清晰
    CVE-2023-3450:锐捷 RG-BCR860 命令执行漏洞复现
    Python Day4爬虫-selenium滚动和常见反爬
    Android Studio 新版本 Logcat 速查
    原型、原型链、判断数据类型
  • 原文地址:https://blog.csdn.net/u012863565/article/details/126506840