Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用libcurl下载UTF-8文件(ANSI工作正常)_C++_Curl_Encoding_Utf 8_Libcurl - Fatal编程技术网

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

C++ 使用libcurl下载UTF-8文件(ANSI工作正常),c++,curl,encoding,utf-8,libcurl,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 resu

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
(根据例如记事本++)时,它工作正常。但是,当我尝试下载
UTF-8
文件(
UTF-8无BOM
)时,由于编码问题,我在某些字符(例如波兰字母)上遇到了错误

例如,我为两个文本相同的文件运行代码(“tojest teśćto”),并将其保存到
std::wstring
result
来自
ANSI
文件,而
result2
来自
UTF-8
版本:

在服务器上用记事本++等打开的两个文件都显示正确的文本


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


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

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


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

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


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

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



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

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

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

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

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

以宽字符串存储UTF-8没有多大意义。这样做有什么意义?代码没有将UTF-8存储在
std::wstring
中。它将UTF-8存储在
std::string
中,然后在下载完成后将其转换为
std::wstring
。问题在于转换,而不是下载本身。@MrEricSir,正如我所想(如果我错了,请纠正我),wstring可以存储宽字符,并且可以与UTF-8配合使用(它将使用超过1个字节来存储我的波兰语文本的字符)。调试器也显示了这一点。而且,将其存储在字符串中还不清楚(同样,find等方法也不会像它们应该的那样工作)。@PolGraphic No,顾名思义,UTF-8旨在以8位字符存储。UTF-16预计以16位字符存储。在Windows wchar_____t是一个16位字符,因此您可以将UTF-16字符串存储在wstring中。@Ericsir先生,我在这方面不是专家,但我知道我在使用
std::string