Как перекодировать текст из кодировки 866 в кодировку 1251 или UTF-8?

Как правильно перегнать символы кириллицы из вектора v в кодировку UTF-8 или CP1251? Я пытался использовать код с переводом строки из CP1251 в IBM-866, но получаю неожиданные результаты с тремя символами, имеющими одинаковый код. Вот мой текущий код:

```cpp
QString dnp = "ДНП";
QByteArray ba = dnp.toLocal8Bit();
const char *c_str2 = ba.data();
QString buf = QTextCodec::codecForName("CP1251")->toUnicode(c_str2);
delete[] c_str2;
dnp = QTextCodec::codecForName("IBM-866")->fromUnicode(buf).data();
if (strcmp(v[5].c_str(), dnp.toStdString().c_str()) == 0) {
    qDebug() << v;
}
```

Я хотел бы узнать, как правильно выполнить конвертацию вектора v в кодировку UTF-8 или CP1251, чтобы продолжить работу с ним.
  • 10 ноября 2023 г. 8:58
Ответы на вопрос 2
Для перекодировки текста из кодировки 866 в кодировку 1251 или UTF-8 вам потребуется использовать соответствующие функции или классы для работы с кодировками в выбранном языке программирования. 

Представлю примеры кода для выполнения конвертации в C++:

Для перекодировки из кодировки 866 в кодировку 1251:
```cpp
#include <iostream>
#include <string>
#include <codecvt>

std::wstring convertToWstring(const std::string& str) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    return converter.from_bytes(str);
}

std::string convertFromWstring(const std::wstring& wstr) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    return converter.to_bytes(wstr);
}

int main() {
    std::string input = "Какой-то текст в кодировке 866";
    std::wstring wstr = convertToWstring(input);

    // В wstr теперь хранится текст в формате UTF-16 (wstr - wide string)

    // Далее, если требуется перекодировать в кодировку 1251:
    std::string output = convertFromWstring(wstr);

    std::cout << output << std::endl;

    return 0;
}
```

Для перекодировки из кодировки 866 в кодировку UTF-8:
```cpp
#include <iostream>
#include <string>
#include <codecvt>

std::wstring convertToWstring(const std::string& str) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    return converter.from_bytes(str);
}

std::string convertToUtf8(const std::wstring& wstr) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    return converter.to_bytes(wstr);
}

int main() {
    std::string input = "Какой-то текст в кодировке 866";
    std::wstring wstr = convertToWstring(input);

    // В wstr теперь хранится текст в формате UTF-16 (wstr - wide string)

    // Далее, если требуется перекодировать в UTF-8:
    std::string output = convertToUtf8(wstr);

    std::cout << output << std::endl;

    return 0;
}
```

Оба примера используют класс `std::wstring_convert` из библиотеки `<codecvt>`, который позволяет конвертировать строки между различными форматами кодировок. При перекодировке в функции `convertToWstring` входная строка преобразуется в формат `std::wstring` (UTF-16), а функция `convertFromWstring` выполняет обратное преобразование. Функция `convertToUtf8` преобразует `std::wstring` встроку формата UTF-8.
Так, сработает:
std::string dnp2 = QTextCodec::codecForName("IBM-866")->fromUnicode(buf).data();
Похожие вопросы