Как перевести массив байтов в строку UTF-8 в Visual C++

461
09 июня 2017, 11:35

Имею массив байтов, байты в массив записаны в кодировке UTF-8, соответственно нужно как-то преобразовать байты в строку такой же кодировке, каким образом это можно сделать?

unsigned char binarr[1024]; // условно этот массив заполнен байтами считанными из файла
string test = ""; // в эту строку желаю сунуть символы преобразованные из массива байтов

Вот так выглядит эта процедура в C#:

 byte[] foo;
 string test = Encoding.Unicode.GetString(foo);
Answer 1

std::string это и так набор char. Т.е. однобайтовый набор. Главное тут понимать, что отдельно взятый элемент такой строки (например, с помощью operator[]) не обязан быть валидным символом, т.к. UTF-8 многобайтовая кодировка. Заполнить же std::string из массива можно соответствующим конструктором, например так:

std::string test(binarr, размер_полезных_данных_массива);

А вот как интерпретировать этот набор уже совсем дело другое. То есть зависит от того, как дальше вы хотите работать со строкой test.

Answer 2

Пример работающего кода:

wchar_t wctxt[512];
char    mbtxt[256];
char *utf8_to_oem(const char *s)
{
    MultiByteToWideChar(CP_UTF8,0,s,strlen(s),wctxt,256);
    CharToOemW(wctxt,mbtxt);
    return mbtxt;
}

Или тебе наоборот нужно?

READ ALSO
Как правильно вернуть *handle функцией

Как правильно вернуть *handle функцией

ЗдравствуйтеЕсть объявление структуры

245
Как в Qt 5.9 подключить драйвер MySql?

Как в Qt 5.9 подключить драйвер MySql?

Добрый день, пытаюсь подключиться к БД но в консоль выдаёт

580
Отследить, что и где обращается к элементу

Отследить, что и где обращается к элементу

Как можно отследить, какая функция обращается и что делает с каким-то элементом? У меня в проекте возник баг, суть которого заключается в том,...

257
Нужно найти библиотеку для Datepicker'a

Нужно найти библиотеку для Datepicker'a

На этой странице размещена секция с 2 кнопками "Сегодня" и "завтра", по центру скролл с выбором дат и слева датепикерНе могу найти данную библиотеку,...

228