茫茫忙盲 2024-07-26 15:15 采纳率: 60%
浏览 6
已结题

C++获取网页资源遇见这两个问题怎么解决

下面的代码运行之后,向服务器获取网页资源代码发现,有的服务器返回的资源代码不全,只有一小部分,后面的就没了。还有就是大多数代码中中文乱码,如何解决。

img

img

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-07-30 10:52
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户在使用C语言获取网页资源时遇到了两个问题:

    1. 部分服务器返回的资源代码不全。
    2. 大多数代码中出现中文乱码。

    解决方案

    问题1:部分服务器返回的资源代码不全

    原因分析:

    • 可能是网络连接不稳定导致数据传输中断。
    • 可能是服务器端的响应不完整。
    • 可能是代码中对响应的处理不完整。

    解决思路:

    • 确保网络连接稳定。
    • 检查服务器端的响应是否完整。
    • 在代码中增加对响应完整性的检查和处理。

    代码修改:

    1. 增加对响应头部的检查,确保服务器返回完整的响应。
    2. 增加对响应数据的完整性检查,确保所有数据都被正确接收。
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
    
    struct MemoryStruct {
        char *memory;
        size_t size;
    };
    
    static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
        size_t realsize = size * nmemb;
        struct MemoryStruct *mem = (struct MemoryStruct *)userp;
    
        char *ptr = realloc(mem->memory, mem->size + realsize + 1);
        if(ptr == NULL) {
            // out of memory!
            printf("not enough memory (realloc returned NULL)\n");
            return 0;
        }
    
        mem->memory = ptr;
        memcpy(&(mem->memory[mem->size]), contents, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;
    
        return realsize;
    }
    
    int main(void) {
        CURL *curl_handle;
        CURLcode res;
    
        struct MemoryStruct chunk;
        chunk.memory = malloc(1);  // will be grown as needed by the realloc above
        chunk.size = 0;    // no data at this point
    
        curl_global_init(CURL_GLOBAL_ALL);
    
        curl_handle = curl_easy_init();
    
        // 设置URL
        curl_easy_setopt(curl_handle, CURLOPT_URL, "http://example.com");
    
        // 设置回调函数
        curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    
        // 设置回调函数的数据结构
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
    
        // 设置超时时间
        curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 10L);
    
        // 执行请求
        res = curl_easy_perform(curl_handle);
    
        // 检查请求是否成功
        if(res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        } else {
            // 打印接收到的数据
            printf("%lu bytes retrieved\n", (unsigned long)chunk.size);
            printf("%s\n", chunk.memory);
        }
    
        // 清理
        curl_easy_cleanup(curl_handle);
        free(chunk.memory);
        curl_global_cleanup();
    
        return 0;
    }
    

    问题2:大多数代码中出现中文乱码

    原因分析:

    • 可能是服务器返回的编码格式与代码中处理的编码格式不一致。
    • 可能是代码中没有正确处理字符编码转换。

    解决思路:

    • 确定服务器返回的编码格式(如UTF-8、GBK等)。
    • 在代码中增加字符编码转换的处理。

    代码修改:

    1. 增加对响应编码的检查和处理。
    2. 使用合适的字符编码转换库(如iconv)进行编码转换。
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
    #include <iconv.h>
    
    struct MemoryStruct {
        char *memory;
        size_t size;
    };
    
    static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
        size_t realsize = size * nmemb;
        struct MemoryStruct *mem = (struct MemoryStruct *)userp;
    
        char *ptr = realloc(mem->memory, mem->size + realsize + 1);
        if(ptr == NULL) {
            // out of memory!
            printf("not enough memory (realloc returned NULL)\n");
            return 0;
        }
    
        mem->memory = ptr;
        memcpy(&(mem->memory[mem->size]), contents, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;
    
        return realsize;
    }
    
    int convert_encoding(char *inbuf, size_t inlen, char *outbuf, size_t outlen, const char *from_encoding, const char *to_encoding) {
        iconv_t cd = iconv_open(to_encoding, from_encoding);
        if (cd == (iconv_t)-1) {
            perror("iconv_open");
            return -1;
        }
    
        char *inptr = inbuf;
        char *outptr = outbuf;
        size_t inbytesleft = inlen;
        size_t outbytesleft = outlen;
    
        if (iconv(cd, &inptr, &inbytesleft, &outptr, &outbytesleft) == (size_t)-1) {
            perror("iconv");
            iconv_close(cd);
            return -1;
        }
    
        iconv_close(cd);
        return 0;
    }
    
    int main(void) {
        CURL *curl_handle;
        CURLcode res;
    
        struct MemoryStruct chunk;
        chunk.memory = malloc(1);  // will be grown as needed by the realloc above
        chunk.size = 0;    // no data at this point
    
        curl_global_init(CURL_GLOBAL_ALL);
    
        curl_handle = curl_easy_init();
    
        // 设置URL
        curl_easy_setopt(curl_handle, CURLOPT_URL, "http://example.com");
    
        // 设置回调函数
        curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    
        // 设置回调函数的数据结构
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
    
        // 设置超时时间
        curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 10L);
    
        // 执行请求
        res = curl_easy_perform(curl_handle);
    
        // 检查请求是否成功
        if(res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        } else {
            // 打印接收到的数据
            printf("%lu bytes retrieved\n", (unsigned long)chunk.size);
    
            // 假设服务器返回的是GBK编码,需要转换为UTF-8
            char *utf8_buffer = malloc(chunk.size * 2);
            if (convert_encoding(chunk.memory, chunk.size, utf8_buffer, chunk.size * 2, "GBK", "UTF-8") == 0) {
                printf("%s\n", utf8_buffer);
            } else {
                printf("Encoding conversion failed\n");
            }
    
            free(utf8_buffer);
        }
    
        // 清理
        curl_easy_cleanup(curl_handle);
        free(chunk.memory);
        curl_global_cleanup();
    
        return 0;
    }
    

    总结

    通过上述代码修改,可以解决部分服务器返回的资源代码不全和大多数代码中出现中文乱码的问题。确保网络连接稳定、检查服务器响应的完整性、正确处理字符编码转换是解决这些问题的关键步骤。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月7日
  • 已采纳回答 7月30日
  • 创建了问题 7月26日

悬赏问题

  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图