0

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

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

关于我正在尝试制作的软件:它使用 CSV 表单,带有阿根廷各个州的名称,已经尝试更改 .CSV 上的编码。它根据在 CSV 上找到的名称加载图像、更改它们并保存。
我知道也许我缺少一些基本的东西,但已经耗尽了我的资源。

4

1 回答 1

1

IMG_Load()将其file论点直接转发给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);
}

AndSDL_RWFromFile()file参数应该是一个 UTF-8 字符串:

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

功能参数:

  • file:一个 UTF-8 字符串,表示要打开的文件名
  • mode:一个 ASCII 字符串,表示用于打开文件的模式;详情见备注

所以将 UTF-8 路径传递到IMG_Load().

C++11通过前缀内置了UTF-8字符串文字支持:u8

IMG_Load( u8"córdoba.jpg" );
于 2018-07-18T07:24:20.797 回答