Как выполнить итерацию std::string, чтобы получить набор Freetype FT_ULong?

std::string обычно интерпретируется как UTF8, поэтому имеет кодировку переменной длины. В моем средстве визуализации шрифтов я столкнулся с проблемой, заключающейся в том, что я не уверен, как получить «символ» из std::string и преобразовать его в Freetype FT_ULong, чтобы получить глиф с FT_Get_Char_Index. То есть я не уверен, что то, что я делаю, является «правильным», поскольку я просто перебираю std::string и пересчитываю полученные символы (конечно, это неправильно, хотя это работает с настройками моей ОС по умолчанию).

Итак, существует ли «правильный» способ сделать это и, что более важно, кто-то написал библиотеку, которая реализует этот «правильный» способ, который я могу использовать в готовом виде?


person Robinson    schedule 25.07.2014    source источник
comment
Вы знаете, как кодируется UTF8? Просто прочитайте следующий символ из строки, и вы будете знать, сколько байтов необходимо для текущей кодовой точки и как преобразовать ее в любую другую кодировку.   -  person Some programmer dude    schedule 25.07.2014
comment
Или вы можете преобразовать его в UTF-16 (или даже UTF-32).   -  person leemes    schedule 25.07.2014
comment
Ничего в стандарте, но ICU, бойкий, см. здесь: stackoverflow.com/questions/4579215/ (ICU был бы самым мощным выбором, но это довольно большой зверь   -  person peterchen    schedule 25.07.2014
comment
@leemes: UTF-16 также является кодировкой переменной длины.   -  person peterchen    schedule 25.07.2014
comment
Интересно, есть ли мне нужна простая функция, которая просто преобразует UTF8 в 32 бита (без знака). Хотя я читаю, что UTF8 может иметь до 6 байтов, что кажется немного чрезмерным, но для всех практических целей... Я полагаю, мне также нужна функция, которая определяет, правильно ли сформирована строка или нет.   -  person Robinson    schedule 25.07.2014
comment
@Robinson UTF8 может содержать до шести байтов для одной кодовой точки, но это всего лишь 31 бит данных. Вы знаете, как это закодировано, да?   -  person Some programmer dude    schedule 25.07.2014
comment
Я получил это сейчас на самом деле. Я нашел какой-то код, где делается преобразование, с таблицей и просмотрев его, я вроде понял. Меня все еще удивляет, что для этого нет функции std::. Кажется, что-то вроде основной вещи в эти дни. sydney.edu.au/engineering/it/~ graphapp/package/src/utility/   -  person Robinson    schedule 25.07.2014


Ответы (1)


Сначала вы должны проверить, как кодируется UTF8, и узнать, какие стартовые биты имеют количество байтов.

См. http://en.wikipedia.org/wiki/UTF8.

И тогда вы можете написать такой код:

  if ((byte & 0x80) == 0x00) {
    // 1 byte UTF8 char
  }
  else if ((byte & 0xE0) == 0xC0) {
    // 2 bytes UTF8 char
  }
  else if ...

Затем вы можете перебирать каждый символ UTF8 в std::string с правильными байтами.

person Mine    schedule 25.07.2014