自由类型函数可以接受 Unicode 文件名吗?

Can freetype functions accept Unicode filenames?

本文关键字:Unicode 文件名 类型 函数 自由      更新时间:2023-10-16

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

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

曾经在项目是ASCII时工作,但在Unicode时不再工作。有没有办法让自由类型接受Unicode文件名,一些预处理器定义将其切换到Unicode?

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

在 Linux 上,您可以尝试使用 setlocale以便 fopen 接受 UTF8 字符串,wchar_t字符串转换为 UTF8。但是在Windows上它不起作用。因此,要么将文件加载到内存,要么将 psz文件名转换为 8 位编码,然后将其传递给FT_New_Face。

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

您可以使用

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

祝你好运