我遇到了一个问题,那就是:在使用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上的名称加载图像,进行更改并保存。
我知道也许我缺少一些基本知识,但已经耗尽了我的资源。
答案 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" );