自由类型函数可以接受 Unicode 文件名吗?
Can freetype functions accept Unicode filenames?
我有一个使用 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 可以从您想要的任何流中读取字体数据。
祝你好运
- 从命令行c++发送文本文件名
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- C++ - Unicode Newline
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何将unicode字符串从C++传递到delphi
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 如何在CPP的给定目录中列出UTF编码的文件名?
- ascii 和 unicode 在处理级别有什么区别吗?
- 无法从 std::string 中提取C++ Unicode 符号
- 在Visual Studio 2019中保存时ReadDirectoryChangesW文件名的问题
- C++:在Windows中浏览名称中带有点的文件名
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 不带预处理器的调用方法/文件的文件名/行号
- 在 C++ 中为文件名添加时间戳
- 支持档案wxWidgets中文件名的Unicode
- QFile::打开失败,并显示 unicode 文件名
- 使用 MAPI 的文件附件的 Unicode 文件名
- 自由类型函数可以接受 Unicode 文件名吗?
- 用unicode文件名保存文件的问题-如何以跨平台的方式正确保存UTF-8文件名
- 如何使用 unicode 文件名 c++ 读取二进制文件