【问题标题】:SDL2 loading files with special charactersSDL2 加载带有特殊字符的文件
【发布时间】:2018-07-18 04:57:28
【问题描述】:

我遇到了一个问题,那就是:在使用 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 上的名称加载图像、更改它们并保存。
我知道我可能缺少一些基本的东西,但已经耗尽了我的资源。

【问题讨论】:

  • 您需要确保传递 UTF-8 编码的字符串(而不是单字节编码的字符串)并且 SDL 是使用 Unicode 支持构建的(即定义了 UNICODE_UNICODE ) 所以它使用宽字符串并在内部调用CreateFileW

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


【解决方案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" );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2014-04-17
    • 2014-05-27
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多