2012-04-09 64 views
2

我有一個使用freetype的MSVC項目,現在我試圖將它移動到Unicode。但是freetype函數不接受文件路徑的LPCTSTR參數,他們想要「const char *」。因此,如freetype函數可以接受Unicode文件名嗎?

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

用於工作時項目是ascii但不再是時,它是Unicode。有沒有辦法讓freetype接受Unicode文件名,一些預處理器定義切換到unicode也許?

回答

4

在C++標準(2003)中沒有wfopen。由於freetype是可移植的,它只使用fopen,它只能接受const char *文件名。因此,無論是將文件加載到內存(或內存映射它),然後使用FT_New_Memory_Face來創建字體或將wchar_t pszFileName轉換爲8位編碼,由於無法進行轉換,可能會丟失字符。

在linux上,您可以嘗試使用setlocale,這樣fopen將接受UTF8字符串,將wchar_t字符串轉換爲UTF8。但是,窗口it won't work上的。因此要麼將文件加載到內存中,要麼將pszFileName轉換爲8位編碼,然後將其傳遞給FT_New_Face。

+0

在Windows上,是沒有辦法使用UTF-8編碼的文件路徑打開的文件,所以我想唯一的辦法是記憶面孔選項。 – 2012-04-09 15:14:58

+3

您可以獲取文件的簡短文件名並傳遞該文件。 – bames53 2012-04-09 15:29:38

+1

你也不應該在Linux上使用wchar_t字符串作爲文件名。在Linux上,文件名本身是char *,甚至可能不在已知的區域設置編碼中,因此不可能在編碼之間進行轉換。您應該簡單地將用戶的文件名視爲不透明的數據塊。 – bames53 2012-04-09 15:32:21

1

你最好打賭的可能是遵循框架的約定和導入tchar.h,然後改用_tfopen(並切換到LPCTSTR,_T("your_string")等)。這將允許您在Linux和Windows上編譯相同的代碼,而且幾乎不變,同時在代碼中支持UTF-16或UTF-8。

+1

你的意思是改變freetype本身的源代碼並重新編譯它? – sashoalm 2012-04-09 15:49:41

+0

如果可能/實際......這顯然取決於你需要做多少個地方,但如果只有幾個地方值得這樣做。 – Mehrdad 2012-04-09 16:45:33

+0

這真的需要**很多工作**。更簡單的是將所有窄字符保留在freetype中,但是替換'ft_fopen'將UTF-8轉換爲UTF-16並在Windows上調用'wfopen'。那麼'FT_New_Face'會神奇地支持UTF-8。 – ybungalobill 2015-06-27 18:57:42

0

您可以使用FT_Open_Face方法,它需要一個FT_Open_Args結構作爲參數。 在FT_Open_Args.stream中,您可以設置習俗讀取和關閉回調,FreeType可以從您想要的任何流中讀取字體數據。

好運