【问题标题】:Can freetype functions accept Unicode filenames?freetype 函数可以接受 Unicode 文件名吗?
【发布时间】:2012-04-09 14:51:10
【问题描述】:

我有一个使用 freetype 的 MSVC 项目,现在我正在尝试将其移至 Unicode。但是 freetype 函数不接受文件路径的 LPCTSTR 参数,它们需要“const char *”。像这样的代码

    WINDOWS_FONT WindowsFont;
    // ....
    FT_New_Face (pLibrary, WindowsFont.pszFileName, i, &face); // WindowsFont.pszFileName is LPTSTR

以前在项目是 ascii 时可以工作,但在项目是 Unicode 时就不行了。有没有办法让 freetype 接受 Unicode 文件名,一些预处理器定义可能将其切换为 unicode?​​p>

【问题讨论】:

    标签: c++ visual-studio unicode freetype


    【解决方案1】:

    C++ 标准 (2003) 中没有 wfopen。由于 freetype 是可移植的,它只使用 fopen,它只能接受 const char* 文件名。因此,要么将文件加载到内存(或内存映射),然后使用 FT_New_Memory_Face 创建字体,要么将 wchar_t pszFileName 转换为 8 位编码,由于无法转换,可能会丢失字符。

    在 linux 上,您可以尝试使用setlocale,这样 fopen 将接受 UTF8 字符串,将 wchar_t 字符串转换为 UTF8。但是在 Windows it won't work 上。所以要么将文件加载到内存,要么将 pszFileName 转换为 8 位编码,然后将其传递给 FT_New_Face。

    【讨论】:

    • 您可以获取文件的短文件名并传递它。
    • 另外你不应该在 Linux 上使用 wchar_t 字符串作为文件名。在 Linux 上,文件名本身就是 char*,甚至可能不是已知的语言环境编码,因此无法在编码之间进行转换。您应该简单地将来自用户的文件名视为不透明的数据块。
    • @bames53:好主意,但文件可能没有短名称。但 Windows 现在确实支持符号链接,因此您可以使用符号链接为文件指定 ASCII 名称。
    • @dan04 是的,不幸的是,微软不久前宣布他们最终将在未来的某些 Windows 版本中完全消除短名称。很快将无法用标准 C++ 打开某些文件。
    • 我希望微软支持 UTF-8 作为 ANSI 代码页;这将使编写跨平台 C++ 程序变得更加容易。但这可能就是他们不这样做的原因。
    【解决方案2】:

    您最好的选择可能是遵循框架的约定并导入tchar.h,然后改用_tfopen(并切换到LPCTSTR_T("your_string") 等)。这将使您几乎无需更改即可为 Linux 和 Windows 编译相同的代码,同时在代码中支持 UTF-16 或 UTF-8。

    【讨论】:

    • 你的意思是改变freetype本身的源代码重新编译?
    • 如果可能/可行...这显然取决于您需要在多少个地方执行此操作,但如果只是几个地方可能值得。
    • 这确实需要大量工作。更简单的方法是将所有内容都保留在 freetype 中,但替换 ft_fopen 以将 UTF-8 转换为 UTF-16 并在 Windows 上调用 wfopen。那么FT_New_Face 会神奇地支持 UTF-8。
    【解决方案3】:

    您可以使用 FT_Open_Face 方法,它需要一个 FT_Open_Args 结构体作为参数。 在 FT_Open_Args.stream 中可以设置自定义读取和关闭回调,FreeType 可以从任何你想要的流中读取字体数据。

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 2011-03-20
      • 2012-03-08
      相关资源
      最近更新 更多