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
相关产品推荐
相关产品推荐

