Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с русскими символами в FreeType2? Проблема с FT_Load_Char 
V
    Опции темы
Proger10
Дата 12.4.2017, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Пытаюсь пропихнуть русские символы в FreeType2, но вместо символов вижу квадраты, что очевидно, покуда FT_Load_Char забирает у меня один байт на один символ, а русские символы в UTF-8 - занимают два байта.

Вот официальный пример FreeType2: https://www.freetype.org/freetype2/docs/tutorial/example1.c

Выдержка оттуда:
Код

text          = argv[2];                           /* second argument    */
num_chars     = strlen( text );
...
for ( n = 0; n < num_chars; n++ )
  {
    ...
    /* load glyph image into the slot (erase previous one) */
    error = FT_Load_Char( face, text[n], FT_LOAD_RENDER );


В этом примере предполагается один байт на символ (strlen(text)), что не верно для наших в UTF-8. (мне код нужен переносимый: OS X <-> Win ).

В качестве символа FT_Load_Char принимает "unsigned long", но я совершенно не понимаю, как мне символ (в UTF-8) подать ему в этот unsigned long?

Я могу разбить строчку std::string на std::vector < std::string >, где каждый элемент будет: std::string символа размером в два байта (парсинг UTF-8). Но что дальше делать с этим?

Грубо говоря, я не понимаю как проделать вот что:

Код

std::string charStr = "ф";
error = FT_Load_Char( face, charStr, FT_LOAD_RENDER );


Как сконвертить этот символ ему в unsigned long совершенно не понимаю...
PM MAIL   Вверх
volatile
Дата 12.4.2017, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Proger10 @  12.4.2017,  08:50 Найти цитируемый пост)
а русские символы в UTF-8 - занимают два байта.

а с чего вы взяли что ему нужно UTF-8 ?
если
Цитата(Proger10 @  12.4.2017,  08:50 Найти цитируемый пост)
В качестве символа FT_Load_Char принимает "unsigned long", 

то скорей всего нужен нормальный юникод
попробуйте так

Код

error = FT_Load_Char( face, L'ф', FT_LOAD_RENDER );

скорей всего заработает.
если нет, и нужен действительно UTF-8, то задавайте вопрос типа: как переносимо преобразовать строку в UTF-8
PM MAIL   Вверх
Proger10
Дата 12.4.2017, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата(volatile @ 12.4.2017,  09:27)

то скорей всего нужен нормальный юникод
попробуйте так

Код

error = FT_Load_Char( face, L'ф', FT_LOAD_RENDER );

скорей всего заработает.

Реально, именно так и работает smile
Не подскажите как сконвертить: 
Код

std::string charStr = "ф"; // всего один символ

в юникодное представление?

Это сообщение отредактировал(а) Proger10 - 12.4.2017, 10:02
PM MAIL   Вверх
volatile
Дата 12.4.2017, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Код

std::wstring charStr = L"ф"; // 

 
 



PM MAIL   Вверх
Proger10
Дата 12.4.2017, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Спасибо! Сейчас опробуем smile

Добавлено:
Не, тоже не прокатило, не срабатывает smile Я пробовал схожий вариант, почему и скинул эту charStr smile

Вот что я получаю:

Код

my-test.cpp:94:7: error: no matching function for call to 'FT_Load_Char'
                if( FT_Load_Char( face, charStr, FT_LOAD_RENDER ) ) throw "Error, glyph not load!! \n";
                    ^~~~~~~~~~~~
/usr/local/opt/freetype/include/freetype2/freetype/freetype.h:2677:3: note: candidate function not viable: no known conversion from 'std::wstring'
      (aka 'basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >') to 'FT_ULong' (aka 'unsigned long') for 2nd argument
  FT_Load_Char( FT_Face   face,
  ^
1 error generated.


Это сообщение отредактировал(а) Proger10 - 12.4.2017, 11:05
PM MAIL   Вверх
volatile
Дата 12.4.2017, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Proger10, вы С/С++ второй день изучаете чтоли?

зачем подавать  std::wstring в функцию, требующую лишь один простой юникодный символ

надо как-то так:
Код

FT_Load_Char( face, charStr[0], FT_LOAD_RENDER ) );



PM MAIL   Вверх
Proger10
Дата 12.4.2017, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



Цитата(volatile @  12.4.2017,  11:11 Найти цитируемый пост)
вы С/С++ второй день изучаете чтоли?

Хахах smile) Мне просто с wstring ранее не приходилось сталкиваться, машинально подумал, что wstring[ 0 ] получится такой же трэш как и в случае std::string str[0], то бишь просто первый байт от двухбайтного символа smile но теперь понимаю, что WideString для тех задачей и создан был, чтобы преодолеть эту проблему smile

Спасибо, теперь понял как дальше с этим работать smile
PM MAIL   Вверх
Google
  Дата 18.9.2019, 01:42 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0748 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.