Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как работать с русскими символами в FreeType2?


Автор: Proger10 12.4.2017, 08:50
Пытаюсь пропихнуть русские символы в 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 совершенно не понимаю...

Автор: volatile 12.4.2017, 09:27
Цитата(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

Автор: Proger10 12.4.2017, 10:01
Цитата(volatile @ 12.4.2017,  09:27)

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

Код

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

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

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

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

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

Автор: volatile 12.4.2017, 10:55
Код

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

 
 



Автор: Proger10 12.4.2017, 11:01
Спасибо! Сейчас опробуем 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.

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

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

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

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



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

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

Спасибо, теперь понял как дальше с этим работать smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)