You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:07:05