C++使用libcurl库返回数据出现中文乱码

我在使用c++的libcurl库访问网站返回数据出现中文乱码想知道解决办法
程序是

#include <iostream>
#include <curl/curl.h>
#include<windows.h>
#include<string>
;
// 回调函数,用于处理获取到的网页数据
size_t WriteCallback(char* contents, size_t size, size_t nmemb, std::string* response)
{
    size_t totalSize = size * nmemb;
    response->append(contents, totalSize);
    return totalSize;
}

int main()
{
    // 初始化curl
    curl_global_init(CURL_GLOBAL_DEFAULT);

    // 创建curl句柄
    CURL* curl = curl_easy_init();
    if (curl) {
        // 设置要请求的URL
        curl_easy_setopt(curl, CURLOPT_URL, "https://comment.bilibili.com/1057102166.xml");

        // 设置回调函数,用于处理获取到的网页数据
        std::string response;
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        // 发起请求
        
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK)
            std::cerr << "请求失败,错误代码: " << res << std::endl;
        else
            std::cout << response << std::endl;

        // 清理curl句柄
        curl_easy_cleanup(curl);
    }

    // 清理全局curl资源
    curl_global_cleanup();

    return 0;
}

img

数据被压缩, 需解压, 具体可见我的博客文章: C++使用libcurl库返回数据为乱码的原因分析与解决方案

        curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "");

看网上教程改把电脑改成utf-8编码也没用

你这个是visual studio吧?你把字符集改成Uicode,SDL检查关了。

【以下回答由 GPT 生成】

问题描述的很清楚,你在使用C++的libcurl库访问网站返回数据时遇到了中文乱码问题。以下是解决这个问题的解决办法:

  1. 添加头文件#include <locale>来处理中文字符编码。
  2. 在程序的最开始调用std::locale::global(std::locale(""));来设置全局的本地化环境。
  3. 在回调函数中添加转码逻辑,将获取到的数据由网页的字符编码转换为本地字符编码。具体的转码方式可以使用iconv库来实现。

下面是修改后的代码,已经添加了中文字符编码处理和转码的逻辑:

#include<iostream>
#include<curl/curl.h>
#include<windows.h>
#include<string>
#include<locale>
#include<iconv.h>

// 回调函数,用于处理获取到的网页数据
size_t WriteCallback(char* contents, size_t size, size_t nmemb, std::string* response)
{
    size_t totalSize = size * nmemb;
    response->append(contents, totalSize);
    return totalSize;
}

// 转码函数,将从网页获取到的数据,由网页的字符编码转换为本地字符编码
std::string ConvertCharset(std::string input, const char* fromCharset, const char* toCharset)
{
    std::string output;
    iconv_t converter = iconv_open(toCharset, fromCharset);
    if (converter == (iconv_t)-1)
    {
        std::cerr << "字符编码转换失败" << std::endl;
        return input;
    }

    size_t inputSize = input.size();
    char* inputBuffer = const_cast<char*>(input.c_str());
    size_t outputBufferSize = inputSize * 4; // 预留足够的空间存储转换后的结果
    char* outputBuffer = new char[outputBufferSize];
    char* outputBufferPtr = outputBuffer;

    size_t convertedSize = iconv(converter, &inputBuffer, &inputSize, &outputBufferPtr, &outputBufferSize);
    if (convertedSize == (size_t)-1)
    {
        std::cerr << "字符编码转换失败" << std::endl;
        delete[] outputBuffer;
        iconv_close(converter);
        return input;
    }

    output = std::string(outputBuffer, outputBufferPtr - outputBuffer);

    delete[] outputBuffer;
    iconv_close(converter);
    return output;
}

int main()
{
    // 设置全局的本地化环境
    std::locale::global(std::locale(""));

    // 初始化curl
    curl_global_init(CURL_GLOBAL_DEFAULT);

    // 创建curl句柄
    CURL* curl = curl_easy_init();
    if (curl) {
        // 设置要请求的URL
        curl_easy_setopt(curl, CURLOPT_URL, "https://comment.bilibili.com/1057102166.xml");

        // 设置回调函数,用于处理获取到的网页数据
        std::string response;
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        // 发起请求
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK)
            std::cerr << "请求失败,错误代码: " << res << std::endl;
        else {
            // 转换字符编码
            response = ConvertCharset(response, "GBK", "UTF-8");
            std::cout << response << std::endl;
        }

        // 清理curl句柄
        curl_easy_cleanup(curl);
    }

    // 清理全局curl资源
    curl_global_cleanup();

    return 0;
}

通过以上代码修改,你应该能够解决你的中文乱码问题了。如果还有其他问题,请随时向我提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^