如何通过libcurl传输从libxml2读取的字符串?

时间:2013-07-30 10:11:53

标签: c linux http libcurl libxml2

我需要向服务器发送http-post请求。我选择使用libcurl函数。请求数据必须类似于xml格式。因此,我使用libxml2将字符串转换为xml,然后将xml文件读入buf,将buf传递给libcurl,完成post请求。   由libxml2在encoding-utf8中创建的xml文件,当我将数据发送到libcurl函数时,似乎是正常的。但是我把包裹拿到服务器上,发现英文字符都很正常,但是我的母语“中文”被一个'?'取代,好吧,它真的让我很困惑。   我现在应该怎么做,我可以设置libcurl函数来传输utf-8字符串吗?   好吧,我的测试环境是linux c。   这是我的libml2创建的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 head and body:

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。

这就是全部。

1 个答案:

答案 0 :(得分:0)

_ CURLOPT_POSTFIELDS标志的文档说:“您必须确保数据的格式符合您希望服务器接收它的方式.libcurl不会为您转换或编码。大多数Web服务器将假设此数据为url编码。“尝试对您的数据使用curl_easy_escape(),并将其用作请求的发布数据。