2

我需要向服务器发送一个 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。

就这样。

4

1 回答 1

0

_该CURLOPT_POSTFIELDS标志的文档说“您必须确保按照您希望服务器接收数据的方式格式化数据。libcurl 不会为您转换或编码它。大多数 Web 服务器将假定此数据是 url-encoded。” 尝试使用curl_easy_escape()您的数据,并将其用作您请求的发布数据。

于 2013-07-30T19:19:25.527 回答