我正在使用
libcurl
与我的 http
服务器进行通信。该功能工作正常,直到我尝试读取名称为外语的文件。假设文件名是 फ़ाइल.txt
并且它被放置在 std::wstring filePath
变量中。
CURLFORMcode formAddResult = curl_formadd(&formPost, &lastPtr, CURLFORM_COPYNAME, "file", CURLFORM_FILE, ws2s(filePath).c_str(), CURLFORM_END);
if (formAddResult != CURL_FORMADD_OK) {
std::cerr << "Failed to add form data: " << curl_easy_strerror((CURLcode)formAddResult) << std::endl;
curl_easy_cleanup(curl);
FreeLibrary(hCurlLib);
return false;
}
上面这行代码返回:
Failed to upload file: 26
上面的错误是
CURLE_READ_ERROR
。此错误表明 libcurl
无法读取指定文件。
我正在使用以下函数将
std::wstring
转换为 std::string
std::string ws2s(const std::wstring& wstr) {
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.to_bytes(wstr);
}
我在处理宽字符或转换时做错了。我使用的是 VS-2019,并在项目属性中使用默认的
Unicode character set
。
感谢@Botje,如果将来有人需要的话,这里是解决方案。
我已阅读
std::vector fileBuffer
中的整个文件,然后将文件名转换为UTF-8 encoded C-style string
// Convert the wstring filename to ```UTF-8``` encoded C-style string
std::string filenameUtf8 = convertWStringToUTF8(filename);
struct curl_httppost* formPost = nullptr;
struct curl_httppost* lastPtr = nullptr;
CURLFORMcode formAddResult = curl_formadd(&formPost, &lastPtr,
CURLFORM_COPYNAME, "file",
CURLFORM_BUFFER, filenameUtf8.c_str(),
CURLFORM_BUFFERPTR, fileBuffer.data(),
CURLFORM_BUFFERLENGTH, fileBuffer.size(),
CURLFORM_END);
如果您想知道
UTF-8
转换,
std::string convertWStringToUTF8(const std::wstring& wstr) {
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> utf8_converter;
return utf8_converter.to_bytes(wstr);
}