You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中使用cURL POST发送带重音字符"ààà"遇问题求助

解决cURL POST发送带特殊字符字符串的问题

让我来帮你梳理下之前尝试的问题根源,以及正确的解决方法:

为什么用wchar_t*的方法行不通?

cURL的CURLOPT_POSTFIELDS参数接收的是字节流(也就是char*类型的原始字节),而wchar_t是宽字符类型(通常对应UTF-16或UTF-32编码)。直接把wchar_t*传给cURL,会导致服务器收到的是宽字符的二进制数据,和HTTP传输常用的UTF-8编码不匹配,自然无法正确解析。

另外,wcslen(content)计算的是宽字符的个数(比如"ààà"是3个宽字符),但CURLOPT_POSTFIELDSIZE需要的是字节数(如果是UTF-16编码,3个宽字符对应6字节;UTF-32则是12字节),长度设置错误会导致发送的内容不完整或格式混乱。

为什么设置application/json后会报"Unexpected end of JSON input"?

JSON格式有严格的语法要求:字符串必须用双引号包裹。如果你直接发送ààà(没有外层双引号),或者在代码里直接传递"ààà"(C语言里的字符串字面量,实际发送的是ààà不带引号),服务器在解析JSON时会发现开头不是合法的JSON结构,因此抛出这个错误。

正确的解决方案

方案1:发送普通UTF-8字符串(非JSON)

确保你的字符串是UTF-8编码的char*,正确设置Content-Type并指定编码,同时用strlen()获取正确的字节长度:

#include <curl/curl.h>
#include <string.h>

int main() {
    CURL *curl = curl_easy_init();
    if(curl) {
        // UTF-8编码的"ààà",每个à占2字节,共6字节
        const char *post_data = "ààà";
        
        curl_easy_setopt(curl, CURLOPT_URL, "你的目标接口地址");
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);
        // strlen返回UTF-8字符串的字节数,符合POSTFIELDSIZE要求
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(post_data));
        
        // 设置Content-Type,明确指定UTF-8编码
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: text/plain; charset=UTF-8");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        
        CURLcode res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            fprintf(stderr, "请求失败: %s\n", curl_easy_strerror(res));
        }
        
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return 0;
}

方案2:发送合法的JSON格式数据

如果需要发送JSON,必须构造符合JSON语法的字符串,把内容用双引号包裹(注意C语言里要转义双引号):

#include <curl/curl.h>
#include <string.h>

int main() {
    CURL *curl = curl_easy_init();
    if(curl) {
        // 合法的JSON字符串:用双引号包裹内容,C语言里转义双引号
        const char *json_data = "\"ààà\"";
        // 也可以构造JSON对象:const char *json_data = "{\"content\": \"ààà\"}";
        
        curl_easy_setopt(curl, CURLOPT_URL, "你的目标接口地址");
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(json_data));
        
        // 设置JSON类型的Content-Type,指定UTF-8编码
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json; charset=UTF-8");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        
        CURLcode res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
            fprintf(stderr, "请求失败: %s\n", curl_easy_strerror(res));
        }
        
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Ferdinando D'avino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:16:46