读取包含外语字符的文件名时出现CURLE_READ_ERROR

问题描述 投票:0回答:1

我正在使用

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

c++ windows unicode libcurl
1个回答
0
投票

感谢@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);
}
© www.soinside.com 2019 - 2024. All rights reserved.