在使用libcurl实现Amazon S3访问库的项目中,我遇到了UTF8问题。列出存储桶内容的方法会将相应的请求发送到S3服务器,并进行正确签名和全部。我收到一个xml文档,但数据已损坏。由于下载由libcurl收到的utf8编码的xml数据而导致的字符串损坏
我将它保存到std :: string中。 例如,它开始与下面的片段:
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult
“ListBucketResult”的最后的“T”之后,有一个“0”(零)中的代码,终止所述的std :: string。在调试器中查看字符串的内容或者将它们写入文件显示了这一点,并且在不同的位置上有更多的零,例如,在一些(但不是全部)“>”右括号。
我使用运行在WinXP上的MS Visual Studio 2008,该项目是用unicode支持编译的。
我应该怎么做才能在std :: string内部接收正确的UTF8(根据几个来源,这应该是unicode不可知的)?任何提示在这一个?
bool Http::Download(std::string& url, std::string& targetString, std::vector<std::string>* customHeaders)
{
CURLcode result = CURLE_FAILED_INIT;
dl = true;
if (curl)
{
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &targetString);
if (unsafe)
{
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
}
if (customHeaders)
{
curl_slist* headers = 0;
for (std::vector<std::string>::const_iterator iter = customHeaders->begin(); iter != customHeaders->end(); iter++)
{
headers = curl_slist_append(headers, (*iter).c_str());
headers = curl_slist_append(headers, "\n");
}
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
}
result = curl_easy_perform(curl);
long http_code = 0;
curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);
lastHttpResult = static_cast<int>(http_code);
curl_easy_cleanup(curl);
}
return (result == CURLE_OK);
};
size_t Http::WriteData(char* data, size_t size, size_t nmemb, void* target)
{
if(target)
{
reinterpret_cast<std::string*>(target)->append(data);
size_t len = size * nmemb;
return len;
}
return 0;
};
请张贴您的代码。 – liwp 2012-02-23 21:35:45
编辑︰添加到pastebin的链接 – Martin 2012-02-23 21:44:24
我认为这是太多,不想混乱这个线程。简单的礼貌。 – Martin 2012-02-23 21:49:44