2012-04-09 3 views
2

У меня есть проект MSVC, который использует freetype, и теперь я пытаюсь переместить его в 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++ не существует wfopen (2003). Поскольку freetype предназначен для переносимости, он использует только fopen, который может принимать только имена const char *. Таким образом, либо загружайте файл в память (или карту памяти), а затем используйте FT_New_Memory_Face для создания шрифта или преобразования wchar_t pszFileName в 8-разрядную кодировку, что может привести к потере символов из-за невозможного преобразования.

На Linux, вы можете попытаться использовать setlocale так Еореп будет принимать UTF8 строки, преобразовать wchar_t строку в UTF8. Однако на окнах it won't work. Поэтому либо загружайте файл в память, либо конвертируйте pszFileName в 8-битное кодирование, а затем передайте его в FT_New_Face.

+0

В Windows, нет никакого способа, чтобы открыть файлы с помощью UTF-8 закодированных путей к файлу, так что я думаю, единственный подход был бы вариантом лица памяти. –

+3

Вы можете получить короткое имя файла и передать это. – bames53

+1

Также вы не должны использовать строки wchar_t в качестве имен файлов в Linux. В Linux имя файла является изначально char * и может даже не быть в известной кодировке локали, поэтому преобразование кодировок невозможно. Вы должны просто обрабатывать имя файла от пользователя как непрозрачный блок данных. – bames53

1

Лучше всего, вероятно, следовать соглашению фреймворка и импортировать tchar.h, а затем использовать _tfopen вместо (и переключение на LPCTSTR, _T("your_string") и т.д.). Это позволит вам скомпилировать тот же код для Linux и Windows практически без изменений, поддерживая либо UTF-16, либо UTF-8 в коде.

+1

Вы имеете в виду изменить исходный код самого freetype и перекомпилировать его? – sashoalm

+0

Если возможно/практично ... это, очевидно, зависит от того, сколько мест вам нужно будет делать, но если это всего лишь несколько мест, это может стоить того. – Mehrdad

+0

Это действительно потребует ** много работы **. Намного проще оставить все узкоколейным в freetype, но замените 'ft_fopen', чтобы преобразовать UTF-8 в UTF-16 и вызвать' wfopen' в Windows. Тогда 'FT_New_Face' будет магически поддерживать UTF-8. – ybungalobill

0

Вы можете использовать метод FT_Open_Face, и в качестве аргумента нужна структура FT_Open_Args. В FT_Open_Args.stream вы можете установить обычную проверку и закрыть обратный вызов, а FreeType может считывать данные шрифтов из любого потока, который вы хотите.

удачи

Смежные вопросы