我有一个使用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吗?
答案 0 :(得分:4)
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。
答案 1 :(得分:1)
您最好的选择可能是遵循框架惯例并导入tchar.h
,然后使用_tfopen
代替(并转换为LPCTSTR
,_T("your_string")
等)。这将允许您为Linux和Windows编译相同的代码,几乎不做任何更改,同时在代码中支持UTF-16或UTF-8。
答案 2 :(得分:0)
您可以使用FT_Open_Face方法,它需要FT_Open_Args结构作为参数。 在FT_Open_Args.stream中,您可以设置海关读取和关闭回调,FreeType可以从您想要的任何流中读取字体数据。
祝你好运