SDL2加载带有特殊字符的文件

时间:2018-07-18 04:57:29

标签: c++ c++11 sdl-2 sdl-image

我遇到了一个问题,那就是:在使用SDL2&SDL2_Image的Windows应用程序中,它会打开图像文件,以便以后对图像数据进行修改后保存它们。 当它打开没有特殊字符的图像(例如áéíóúñ,例如,“ buenos aires.jpg” )时,它会按预期工作。 但是,如果提到了任何特殊字符(例如“córdoba.jpg” ),SDL_Image会生成一条错误消息,提示“无法打开文件”。不管怎样,如果我使用的std :: ifstream流量具有我从CSV文件中获得的确切文件名(冗余,如“córdoba.jpg” 或“ misi ó nes.jpg”),ifstream效果很好...使用特殊字符是否出错? UNICODE,UTF有什么关系吗?

有关环境的一些信息:Windows 10(西班牙语,拉丁美洲),SDL2和SDL2_Image(最新版本),使用Mingw64 7.1.0的GCC编译器

关于我要制作的软件:它使用CSV格式,带有阿根廷各个州的名称,已经尝试更改.CSV上的编码。它根据CSV上的名称加载图像,进行更改并保存。
我知道也许我缺少一些基本知识,但已经耗尽了我的资源。

1 个答案:

答案 0 :(得分:1)

IMG_Load() forwards its file argument directly to SDL_RWFromFile()

// http://hg.libsdl.org/SDL_image/file/8fee51506499/IMG.c#l125
SDL_Surface *IMG_Load(const char *file)
{
    SDL_RWops *src = SDL_RWFromFile(file, "rb");
    const char *ext = SDL_strrchr(file, '.');
    if(ext) {
        ext++;
    }
    if(!src) {
        /* The error message has been set in SDL_RWFromFile */
        return NULL;
    }
    return IMG_LoadTyped_RW(src, 1, ext);
}

并且SDL_RWFromFile()file参数应该是UTF-8字符串:

SDL_RWops* SDL_RWFromFile(const char* file,
                          const char* mode)
     

功能参数:

     
      
  • 文件:代表要打开的文件名的UTF-8字符串
  •   
  • mode:ASCII字符串,表示用于打开文件的模式;有关详细信息,请参见备注
  •   

因此将UTF-8路径传递到IMG_Load()

C ++ 11通过u8前缀内置了UTF-8 string literal支持:

IMG_Load( u8"córdoba.jpg" );