我在libcurl
的幫助下編寫了一個簡單的文件下載程序。下面是從HTTP服務器下載文件的代碼:使用libcurl下載UTF-8文件(ANSI工作正常)
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
它工作正常(根據例如記事本++)。但是,當我嘗試下載UTF-8
文件(UTF-8 without BOM
)時,由於編碼問題,我得到某些字符(例如波蘭語字母)的錯誤。
例如,我使用相同的文本(「to jestteśćto」)運行兩個文件的代碼並將其保存到std::wstring
。該result
是ANSI
文件和result2
(有問題的)從UTF-8
版本:
這兩個文件打開了服務器例如Notepad ++顯示正確的文本。
那麼,我怎麼能得到UTF-8
文件內容與libcurl
並將其保存到std::wstring
用正確的編碼(這樣的Visual Studio調試器將顯示它爲to jest teść to
)?
在寬字符串中存儲UTF-8並沒有什麼意義。這麼做的意義何在? – MrEricSir
該代碼未將UTF-8存儲在「std :: wstring」中。它將UTF-8存儲在'std :: string'中,然後在下載完成後將其轉換爲'std :: wstring'。問題在於轉換,而不是下載本身。 –
@MrEricSir正如我的想法(糾正我,如果我錯了)wstring可以存儲寬字符,並將與UTF-8(它將使用超過1個字節來存儲我的波蘭文本字符)很好地工作。調試器也顯示這一點。並且將其存儲在字符串內部還不清楚(還有像find這樣的方法不會像他們應該那樣工作)。 – PolGraphic