[英]Can freetype functions accept Unicode filenames?
我有一個使用 freetype 的 MSVC 項目,現在我正試圖將它移動到 Unicode。但是 freetype 函數不接受文件路徑的 LPCTSTR arguments,它們需要“const char*”。 所以代碼像
WINDOWS_FONT WindowsFont;
// ....
FT_New_Face (pLibrary, WindowsFont.pszFileName, i, &face); // WindowsFont.pszFileName is LPTSTR
曾經在項目為 ascii 時工作,但在項目為 Unicode 時不再工作。有沒有辦法讓 freetype 接受 Unicode 文件名,一些預處理器定義將其切換為 unicode 也許?
C++ 標准 (2003) 中沒有 wfopen。 由於 freetype 是可移植的,它只使用 fopen,它只能接受 const char* 文件名。 因此,要么將文件加載到 memory(或 memory map),然后使用 FT_New_Memory_Face 創建字體,要么將 wchar_t pszFileName 轉換為 8 位編碼,可能會因無法轉換而丟失字符。
在 linux 上,您可以嘗試使用setlocale
,這樣 fopen 將接受 UTF8 字符串,將 wchar_t 字符串轉換為 UTF8。 但是在 windows 上它不起作用。 所以要么加載文件到memory,要么將pszFileName轉換成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可以從任意一個stream中讀取字體數據。
祝你好運
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.