使用libcurl下载UTF-8文件(ANSI工作正常)

时间:2015-10-20 20:22:13

标签: c++ curl encoding utf-8 libcurl

我正在libcurl的帮助下编写一个简单的文件下载程序。这是从HTTP服务器下载文件的代码:

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

std::wstring result; //result with polish letters (ą, ę etc.)
CURL *curl;
CURLcode res;
std::string readBuffer;

curl = curl_easy_init();
ERROR_HANDLE(curl, L"CURL could not been inited.", MOD_INTERNET);
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_easy_setopt(curl, CURLOPT_USERPWD, (login + ":" + password).c_str()); //e.g.: "login:password"
curl_easy_setopt(curl, CURLOPT_POST, true);
//curl_easy_setopt(curl, CURLOPT_ENCODING, "UTF-8"); //does not change anything
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);

result = C::toWString(readBuffer);
return res == 0; //0 = OK

当我要下载的文件被编码为ANSI时(根据例如Notepad ++),它可以正常工作。但是当我尝试下载UTF-8文件(UTF-8 without BOM)时,由于编码问题,我收到了一些字符错误(例如抛光字母)。

例如,我运行具有相同文本的两个文件的代码(“tojestteśćto”)并将其保存到std::wstringresult来自ANSI文件,result2(有问题)来自UTF-8版本:enter image description here

两个文件都在服务器上打开,例如Notepad ++显示正确的文本。

所以,如何使用UTF-8获取libcurl文件内容,并使用正确的编码将其保存到 std::wstring (因此Visual Studio的调试器会将其显示为to jest teść to)?

2 个答案:

答案 0 :(得分:1)

libcurl不会为您转换或翻译内容。它将为服务器发送的应用程序提供准确的字节。

您可以使用HTTP Accept标头等来影响服务器响应的内容,但是如果您对所获得的内容不满意,则需要检查收到的字符集并自行转换。

答案 1 :(得分:1)

这不是一个libcurl问题。您将原始数据存储在std::string中,然后在下载完成后将其转换为std::wstring。您必须查看HTTP响应中报告的字符集,并相应地将数据解码为std::wstringC::toWString()没有charsets的概念,所以你应该使用别的东西,比如ICONV或ICU。或者,如果您知道数据始终是UTF-8,请手动执行转换(UTF转换很容易手动编码),或者使用std::wstring_convert类使用C ++ 11内置的UTF转换