2013-07-30 26 views
2

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

<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。

就是这样。

+0

显然这是一个编码问题。请更详细地描述(一些源代码会很好),你在做什么。在字符串文字或类似文字之前,通常会遇到小小的错误,例如缺少前缀“u”。 – Alfe

+0

好的。例如: – lalala23456

+0

在这个问题中,我描述它:@Alfe – lalala23456

回答

0

_ CURLOPT_POSTFIELDS标记的文档中提到“您必须确保数据的格式符合您希望服务器接收它的方式。libcurl不会为您进行转换或编码大多数Web服务器都会将此数据假设为被网址编码为“。尝试在您的数据上使用curl_easy_escape(),并将其用作请求的发布数据。

+0

感谢您的建议。就在现在,我在我的程序中尝试了这个功能。但是,当我编译它。它给了我一个错误::未定义的引用'curl_easy_escape'。它不起作用。但之前,curl_easy_setopt运作良好。 – lalala23456

+0

这是我的makefile: 目标: gcc -I/usr/local/include -o http-post http-post.c -lcurl – lalala23456

+0

未定义的引用curl_easy_escape?你使用的是libcurl的当前版本吗? –