go-curl CURLOPT_URL引号等效设置与韩文文件名乱码问题咨询
问题1解决方案
curl命令行给URL加英文双引号是shell层面的转义操作,作用是避免shell把URL内的&、空格、通配符等特殊字符解析为shell语法,和curl本身的URL处理逻辑无关。
在go-curl中不需要给URL字符串包裹任何引号,直接传值即可。如果仍有特殊字符导致的下载失败,说明你传入的URL未做合法的百分号编码(URL编码),建议使用Go标准库net/url构造标准合法URL后再传入CURLOPT_URL参数,示例代码如下:
import ( "net/url" "github.com/andelf/go-curl" ) func buildURL(rawBase string, queryParams map[string]string) (string, error) { baseUrl, err := url.Parse(rawBase) if err != nil { return "", err } params := url.Values{} for k, v := range queryParams { params.Add(k, v) } baseUrl.RawQuery = params.Encode() return baseUrl.String(), nil } // 调用示例 finalURL, err := buildURL("https://你的邮件服务器地址/下载路径", map[string]string{ "file": "包含特殊字符的文件名", }) if err != nil { // 错误处理逻辑 } easy.Setopt(curl.OPT_URL, finalURL)
问题2解决方案
你设置的Accept-Charset请求头仅指定响应体内容的字符集,和文件名无关,文件名编码规则定义在响应头Content-Disposition字段中,可按以下步骤处理:
- 先通过go-curl的响应头回调读取到
Content-Disposition字段值 - 优先解析字段中符合RFC 5987规范的
filename*属性(默认UTF-8编码),如果不存在再解析filename属性 - 若
filename属性返回的是韩文原生编码(如EUC-KR),使用编码转换库转成UTF-8即可,示例代码如下:
import ( "mime" "net/url" "strings" "golang.org/x/text/encoding/korea" ) func parseFileName(dispositionHeader string) (string, error) { _, params, err := mime.ParseMediaType(dispositionHeader) if err != nil { return "", err } // 优先取RFC5987编码的文件名 if utf8Name, ok := params["filename*"]; ok && strings.HasPrefix(utf8Name, "utf-8''") { return url.PathUnescape(strings.TrimPrefix(utf8Name, "utf-8''")) } // 处理非标准编码的filename rawName := params["filename"] decoder := korea.EUCKR.NewDecoder() return decoder.String(rawName) }
用解码后得到的UTF-8格式文件名保存文件,就不会出现乱码问题。
内容的提问来源于stack exchange,提问作者송지민
相关产品推荐
相关产品推荐

