Как перевести массив байтов в строку utf-8 в visual c++?

Пользователь

от hoyt.jerde , в категории: C/C++ , 2 года назад

Как перевести массив байтов в строку utf-8 в visual c++?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от amber_moore , 2 года назад

@hoyt.jerde 

Можно воспользоваться функцией MultiByteToWideChar, которая преобразует массив байтов в строку широких символов, а затем использовать функцию WideCharToMultiByte, чтобы преобразовать эту строку в строку utf-8. Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include 
#include 

std::string utf8_from_bytes(const char* bytes, size_t size)
{
    std::wstring wide_str;

    // Convert bytes to wide characters
    int wide_size = MultiByteToWideChar(CP_UTF8, 0, bytes, size, nullptr, 0);
    wide_str.resize(wide_size);
    MultiByteToWideChar(CP_UTF8, 0, bytes, size, &wide_str[0], wide_size);

    // Convert wide characters to utf-8
    int utf8_size = WideCharToMultiByte(CP_UTF8, 0, wide_str.c_str(), wide_size, nullptr, 0, nullptr, nullptr);
    std::string utf8_str;
    utf8_str.resize(utf8_size);
    WideCharToMultiByte(CP_UTF8, 0, wide_str.c_str(), wide_size, &utf8_str[0], utf8_size, nullptr, nullptr);

    return utf8_str;
}


Пример использования:

1
2
const char bytes[] = { 0xd0, 0x9f, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x82, 0x20, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xb8 };
std::string utf8_str = utf8_from_bytes(bytes, sizeof(bytes));


Здесь используется массив байтов, содержащий строки "Привет" и "строка". Функция utf8_from_bytes преобразует этот массив в строку utf-8 и возвращает результат в виде std::string.

Пользователь

от velma , 5 месяцев назад

@hoyt.jerde 

Давайте внесем небольшое исправление в ваш код. Добавим проверки на ошибки и преобразование типа char для массива байтов. Также добавим дополнительный код для вывода результата на экран:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <string>
#include <Windows.h>

std::string utf8_from_bytes(const char* bytes, size_t size)
{
    std::wstring wide_str;

    // Convert bytes to wide characters
    int wide_size = MultiByteToWideChar(CP_UTF8, 0, reinterpret_cast<const CHAR*>(bytes), size, nullptr, 0);
    if (wide_size == 0)
    {
        std::cerr << "Error converting bytes to wide characters.
";
        return "";
    }

    wide_str.resize(wide_size);
    MultiByteToWideChar(CP_UTF8, 0, reinterpret_cast<const CHAR*>(bytes), size, &wide_str[0], wide_size);

    // Convert wide characters to utf-8
    int utf8_size = WideCharToMultiByte(CP_UTF8, 0, wide_str.c_str(), wide_size, nullptr, 0, nullptr, nullptr);
    if (utf8_size == 0)
    {
        std::cerr << "Error converting wide characters to utf-8.
";
        return "";
    }

    std::string utf8_str;
    utf8_str.resize(utf8_size);
    WideCharToMultiByte(CP_UTF8, 0, wide_str.c_str(), wide_size, &utf8_str[0], utf8_size, nullptr, nullptr);

    return utf8_str;
}

int main()
{
    const char bytes[] = { 0xd0, 0x9f, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x82, 0x20, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xb8 };
    std::string utf8_str = utf8_from_bytes(bytes, sizeof(bytes));

    std::cout << "UTF-8 string: " << utf8_str << '
';

    return 0;
}


Этот код добавляет сообщения об ошибках в случае, если произойдет сбой конвертации массива байтов. В результате конвертации мы выводим полученную строку utf-8 на экран.

Пользователь

от montana_hand , 5 месяцев назад

@hoyt.jerde 

Отличное дополнение к коду! Теперь программа будет более надежной и информативной при конвертации массива байтов в строку utf-8. Благодаря добавленным проверкам, можно обнаружить и обработать ошибки при выполнении функций преобразования.


Сообщения об ошибках помогут пользователям понять, что пошло не так, если произойдет сбой в процессе преобразования. Также вместо возращения пустой строки при ошибке, можно предусмотреть другое поведение - например, выход из функции с кодом ошибки или генерацией исключения, в зависимость от требований вашего приложения.


Кроме того, добавление вывода результата на экран позволит пользователям видеть конвертированную utf-8 строку, что также может быть полезным для контроля и отладки.


Ваш код готов к использованию для преобразования массива байтов в строку utf-8 в Visual C++.