3

我有一个使用 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?

4

3 回答 3

6

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

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

于 2012-04-09T15:09:39.307 回答
1

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

祝你好运

于 2012-10-31T06:54:10.857 回答
1

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

于 2012-04-09T15:31:34.673 回答