C++ libcurl接收到的utf8编码的xml数据下载导致字符串损坏

C++ libcurl接收到的utf8编码的xml数据下载导致字符串损坏,c++,xml,unicode,utf-8,libcurl,C++,Xml,Unicode,Utf 8,Libcurl,在一个使用libcurl实现AmazonS3Access库的项目中,我遇到了UTF8的问题。列出bucket内容的方法向S3服务器发送正确签名的适当请求。我收到一个xml文档,但数据已损坏 我将其保存到std::字符串中。 例如,它以以下片段开始: <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult begin();iter!=自定义标题->结束();iter++) { headers=curl\u slist\

在一个使用libcurl实现AmazonS3Access库的项目中,我遇到了UTF8的问题。列出bucket内容的方法向S3服务器发送正确签名的适当请求。我收到一个xml文档,但数据已损坏

我将其保存到std::字符串中。 例如,它以以下片段开始:

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult

begin();iter!=自定义标题->结束();iter++)
{
headers=curl\u slist\u append(headers,(*iter).c_str());
headers=curl\u slist\u append(headers,“\n”);
}
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);
}
结果=curl\u easy\u perform(curl);
长http_代码=0;
curl\u easy\u getinfo(curl、CURLINFO\u RESPONSE\u代码和http\u代码);
lastHttpResult=静态\u转换(http\u代码);
旋度\轻松\清洁(旋度);
}
返回(结果==卷曲_OK);
};
大小\u t Http::WriteData(字符*数据、大小\u t大小、大小\u t nmemb、空*目标)
{
如果(目标)
{
重新解释(目标)->追加(数据);
尺寸长度=尺寸*nmemb;
回程透镜;
}
返回0;
};

这一行很可能是问题的一部分:

reinterpret_cast<std::string*>(target)->append(data);

在我看来,您应该在
WriteData()函数中调用以下函数:

size_t len = size * nmemb;
reinterpret_cast<std::string*>(target)->append(data, len);
size\u t len=size*nmemb;
重新解释(目标)->追加(数据,len);
CURLOPT\u WRITEFUNCTION
的libcurl文档说明:

ptr指向的数据大小乘以nmemb,它不会以零结尾


因此,您不能依靠
append(const char*)
来正确处理append。

我认为这太多了,不想把这个线程弄得乱七八糟。简单礼貌。@Martin除非确实需要,否则请不要链接到外部来源。编辑您的问题以包含代码。感谢您的澄清。不会再这样做了。谢谢你的评论,但它没有改变任何东西。@Martin我会尝试通过Wireshark监控流量,并确保你实际接收的数据中没有空值。根据Wireshark,数据中没有空值。例如,在上面给出的片段中,数据中的空格是0x20,而不是0x00。@Martin一个奇怪的问题;我看不出你的代码还有其他问题。传递给
WriteData
的数据块与空值出现的位置之间是否存在相关性?这真是奇怪。我改变了
reinterpret\u cast(target)->append(data,len)
静态_cast(目标)->追加(数据,len)现在它的行为符合预期。有什么想法吗?我也谢谢你。没有改变结果。
reinterpret_cast<std::string*>(target)->append(data, size * nmemb);
size_t len = size * nmemb;
reinterpret_cast<std::string*>(target)->append(data, len);