SDL2 загружает файлы со специальными символами

У меня возникла проблема, а именно: в приложении Windows, использующем SDL2 и SDL2_Image, оно открывает файлы изображений для последующего сохранения их с изменениями данных изображения. Когда он открывает изображение без специальных символов (например, áéíóúñ, скажем, "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 (актуальные версии), компилятор GCC с использованием Mingw64 7.1.0

О программном обеспечении, которое я пытаюсь сделать: оно использует форму CSV с названиями различных штатов Аргентины, уже пытался изменить кодировку в .CSV. Он загружает изображения на основе имен, найденных в CSV, изменяет их и сохраняет.
Я знаю, что, возможно, мне не хватает чего-то основного, но мои ресурсы уже исчерпаны.


person Platón_actual    schedule 18.07.2018    source источник
comment
Вам нужно убедиться, что вы передаете строку в кодировке UTF-8 (а не строку с однобайтовой кодировкой) и что SDL построен с поддержкой Unicode (то есть определены UNICODE и _UNICODE), поэтому он использует широкие строки и вызывает вызовы CreateFileW внутри.   -  person user7860670    schedule 18.07.2018


Ответы (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);
}

И аргумент file SDL_RWFromFile() должен быть строкой UTF-8:

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

Параметры функции:

  • файл: строка UTF-8, представляющая имя открываемого файла.
  • режим: строка ASCII, представляющая режим, который будет использоваться для открытия файла; подробности см. в примечаниях

Поэтому передайте пути UTF-8 в IMG_Load().

C++11 имеет встроенную поддержку строкового литерала UTF-8 через u8 префикс:

IMG_Load( u8"córdoba.jpg" );
person genpfault    schedule 18.07.2018