C++ freetype函数可以接受Unicode文件名吗?

C++ freetype函数可以接受Unicode文件名吗?,c++,visual-studio,unicode,freetype,C++,Visual Studio,Unicode,Freetype,我有一个使用freetype的MSVC项目,现在我正试图将它迁移到Unicode。但是freetype函数不接受文件路径的LPCTSTR参数,它们需要“const char*”。所以代码像 WINDOWS_FONT WindowsFont; // .... FT_New_Face (pLibrary, WindowsFont.pszFileName, i, &face); // WindowsFont.pszFileName is LPTSTR 在项目为asci

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

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

在项目为ascii时使用,但在为Unicode时不再使用。有没有一种方法可以让Fielype接受Unicode文件名,一些预处理器定义它可以切换到Unicode??< /P> < P>在C++标准中没有WFOPEN(2003)。因为freetype是可移植的,所以它只使用fopen,fopen只能接受const char*文件名。因此,要么将文件加载到内存(要么将其映射到内存),然后使用FT_New_memory_Face创建字体,要么将wchar_t pszFileName转换为8位编码,由于无法转换,可能会丢失字符


在linux上,您可以尝试使用
setlocale
,这样fopen将接受UTF8字符串,并将wchar\u t字符串转换为UTF8。但是,windows上的。因此,要么将文件加载到内存中,要么将pszFileName转换为8位编码,然后将其传递给FT_New_Face。

您最好的办法可能是遵循框架的约定,导入
tchar.h
,然后改用
\u tfopen
(并切换到
LPCTSTR
\u T(“您的字符串”)
,等等)。这将允许您为Linux和Windows编译相同的代码,几乎不做任何更改,同时在代码中支持UTF-16或UTF-8。

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


祝您好运

在Windows上,无法使用UTF-8编码的文件路径打开文件,因此我想唯一的方法是使用内存面选项。您可以获取文件的短文件名并传递该文件。此外,您不应该在Linux上使用wchar\t字符串作为文件名。在Linux上,文件名本机为char*,甚至可能不在已知的区域设置编码中,因此不可能在编码之间进行转换。您应该简单地将用户的文件名视为不透明的数据块。@bames53:好主意,但文件名可能不短。但是Windows现在确实支持符号链接,因此您可以使用符号链接为文件命名为ASCII名称;这将使跨平台的C++程序编写变得更加容易。但这可能就是他们不这么做的原因。你的意思是改变freetype本身的源代码并重新编译它吗?如果可能/可行。。。这显然取决于你需要在多少地方做这件事,但如果只有几个地方,这可能是值得的。这确实需要很多工作。更简单的方法是在freetype中保留所有窄字符,但替换
ft\u fopen
将UTF-8转换为UTF-16,并在Windows上调用
wfopen
。然后,
FT_New_Face
将神奇地支持UTF-8。