我正在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::wstring
。 result
来自ANSI
文件,result2
(有问题)来自UTF-8
版本:
两个文件都在服务器上打开,例如Notepad ++显示正确的文本。
所以,如何使用UTF-8
获取libcurl
文件内容,并使用正确的编码将其保存到 std::wstring
(因此Visual Studio的调试器会将其显示为to jest teść to
)?
答案 0 :(得分:1)
libcurl不会为您转换或翻译内容。它将为服务器发送的应用程序提供准确的字节。
您可以使用HTTP Accept标头等来影响服务器响应的内容,但是如果您对所获得的内容不满意,则需要检查收到的字符集并自行转换。
答案 1 :(得分:1)
这不是一个libcurl问题。您将原始数据存储在std::string
中,然后在下载完成后将其转换为std::wstring
。您必须查看HTTP响应中报告的字符集,并相应地将数据解码为std::wstring
。 C::toWString()
没有charsets的概念,所以你应该使用别的东西,比如ICONV或ICU。或者,如果您知道数据始终是UTF-8,请手动执行转换(UTF转换很容易手动编码),或者使用std::wstring_convert
类使用C ++ 11内置的UTF转换