使用libcurl上传含外文文件名文件时出现CURLE_READ_ERROR错误求助
解决VS2019 Unicode项目中libcurl上传含外文文件名文件的问题
问题根源
Windows系统的文件路径采用UTF-16编码(对应std::wstring),你当前将std::wstring转成UTF-8编码的std::string后传给CURLFORM_FILE,但libcurl在Windows环境下默认会用ANSI编码解析路径,无法识别包含非ASCII字符的文件名,因此触发CURLE_READ_ERROR(错误码26)。
解决方法
方案1:使用libcurl宽字符接口(推荐)
libcurl提供了宽字符版本的表单字段参数CURLFORM_FILEW,直接传入std::wstring的原始宽字符路径即可,无需编码转换:
CURLFORMcode formAddResult = curl_formadd(&formPost, &lastPtr, CURLFORM_COPYNAME, "file", CURLFORM_FILEW, filePath.c_str(), // 直接传宽字符路径 CURLFORM_END);
注意:确保你使用的libcurl版本支持宽字符接口——如果是预编译二进制包,需选择适配Windows Unicode环境的版本;如果自行编译,需开启CURL_WIN32相关编译选项。
方案2:转换为系统默认多字节编码(不推荐)
若无法使用宽字符接口,可将std::wstring转换为Windows系统默认的多字节编码(而非UTF-8),但这种方式仅能支持系统编码覆盖的字符,对于小众语言字符仍可能失效:
#include <windows.h> std::string ws2s_system(const std::wstring& wstr) { int bufferSize = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr); std::string str(bufferSize, 0); WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &str[0], bufferSize, nullptr, nullptr); return str; } // 使用时替换原ws2s调用 CURLFORM_FILE, ws2s_system(filePath).c_str(),
为什么原转换函数无效?
你的ws2s函数将std::wstring转成了UTF-8编码的std::string,但Windows的文件API(如CreateFileA)仅能识别系统默认ANSI编码的路径,UTF-8编码的路径无法被正确解析,导致libcurl找不到目标文件。
内容的提问来源于stack exchange,提问作者noob_user
相关产品推荐
相关产品推荐

