iconv() не может перекодировать из windows1251 в utf8

Рейтинг: 0Ответов: 1Опубликовано: 18.02.2023

Есть функция-обертка над iconv() для загрузки текстового файла и конвертации текста из кодировки в кодировку:

#include <iconv.h>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

string* load_text(char* path, char* encoding){
    // Reading the file
    string* source = new string;
    char buffer;
    ifstream file(path);
    do{
        file.get(buffer);
        source->push_back(buffer);
    }
    while (!file.eof());
    file.close();

    // Re-encoding
    const int BUFSIZE = 1024;
    string* for_return = new string;
    iconv_t cd = iconv_open(encoding, "UTF-8"); // Descriptor
    cout << encoding << "\n";
    if (cd == (iconv_t)(-1)) throw runtime_error("Can`t start iconv");

    char* inptr = (char*)(source->c_str());
    cout << inptr << "\n";
    size_t in_size = source->size();
    char out_buf[BUFSIZE];
    char* out_pointer = out_buf;
    size_t out_size;
    size_t result;
    errno = 0;
    while(in_size > 0){
        out_size = BUFSIZE;
        result = iconv(cd, &inptr, &in_size, &out_pointer, &out_size);
        if (result == (size_t)(-1) && errno){
            cout << errno << "\n";
            throw runtime_error("Can`t decode");
        }
        for_return->append(out_buf);
    }
    if(iconv_close(cd) != 0) throw runtime_error("Can`t close iconv desc");

    return for_return;
}

Прочитать UTF-8 и сконвертировать в windows-1251 может; если попытаться перекодировать windows-1251 в UTF-8, iconv() выдает ошибку 84. Что я сделал неправильно? Запускаю под Ubuntu 20. Заранее спасибо за помощь. PS все файлы, на которых я проверял работу функции, корректно обрабатываются консольной командой iconv. К сожалению, проблема не в тексте, а в моем коде.

Ответы

▲ 2Принят

Надо при создании дескриптора iconv_t cd = iconv_open(encoding, "UTF-8"); поменять аргументы местами. Обидно, что я столько времени потратил из-за пустяковой ошибки: кодировка в которую переводится текст, указывается до исходной.