我需要向服务器发送一个 http-post 请求。我选择使用 libcurl 函数。请求数据必须像 xml 格式。因此,我使用libxml2将字符串转换为xml,然后将xml文件读入buf,将buf传递给libcurl,完成post请求。由libxml2在encoding-utf8中创建的xml文件,当我将数据发送到libcurl函数时,它似乎是正常的。但是我抓包到服务器,发现英文字符都是正常的,但是我的母语“中文”被一个'?'代替了,嗯,这让我很困惑。我现在该怎么办,我可以设置 libcurl 函数来传输 utf-8 字符串吗?好吧,我的测试环境是 linux c 。这是我由 libxml2 创建的 xml:
<vehicleName>±GM7180LE AT</vehicleName>
可以看到,英文字符都是正常的。前两个字符都是中文。他们应该是“别克”。libxml2 会自动将其从 gb2312 转换为 utf8。
xmlSaveFormatFileEnc(createXML, doc, "UTF-8", 1);
然后我将从这个xml读取的字符串发送给libcurl函数,但我发现事实是:服务器接收到的数据不是±GM而是??GM。libcurl 代码是 curl_easy_setopt(curl, CURLOPT_URL, ip_addr); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestMsg); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(requestMsg)); 我现在该怎么办?
回答 Alfe:libxml2 代码如下:
char licenseNo_text[20] = "沪33333";
licenseNo = xmlNewNode(NULL, BAD_CAST "licenseNo");
content = xmlNewText(BAD_CAST licenseNo_text);
xmlAddChild(QueryVehicleModelRequest, licenseNo);
xmlAddChild(licenseNo, content);
将节点添加到 xml 文件后,我将其读入 buf:
while ((ch = getc(fp)) != EOF) {
if (ch != '\n')
buf[i++] = ch;
}
我认为buf已经在utf-8中,所以我直接将它传递给libcurl函数:
ret = func_libcurl(buf, headerfilename, bodyfilename);
func_libcurl 代码是,requestMsg 是 http-post 的头部和主体:
curl_easy_setopt(curl, CURLOPT_URL, ip_addr);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestMsg);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(requestMsg));
headerfilename, bodyfilename 是文件描述符,用于保存来自服务器响应的数据。
最后,我使用 libxml2 解析文件“bodyfilename”。文件“bodyfilename”保存了来自服务器的响应数据。是utf-8格式的,我可以成功解析成gb2312。
就这样。