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

使用Go的exec.Command调用iconv转码后目标文件未生成问题

问题:Go执行iconv命令返回exit status 0但未生成目标文件
  • 操作场景:调用iconv转换文件编码,控制台直接执行命令可正常生成目标文件,但通过Go代码执行后,命令返回exit status 0,却没有生成目标文件。
  • 操作系统:Debian 11
  • 涉事代码:
func main() {
    from := "WINDOWS-1251"
    filename := "3_win1251.csv"
    cmd := exec.Command("iconv", fmt.Sprintf("-f %s", from), fmt.Sprintf("-t UTF-8//TRANSLIT %s", filename), fmt.Sprintf("-o ./convert_%s", filename))
    // command: /usr/bin/iconv -f WINDOWS-1251 -t UTF-8//TRANSLIT 3_win1251.csv -o ./convert_3_win1251.csv
    log.Println(cmd.String())
    err := cmd.Run()
    if err != nil {
        log.Fatal(err)
    }

    log.Println(cmd.ProcessState)
}
问题原因

构造exec.Command参数时犯了核心错误:将多个独立的命令参数合并成了单个字符串。exec.Command要求每个命令参数都是切片的独立元素,不能把带空格的参数揉在一起传递。

比如代码里的fmt.Sprintf("-t UTF-8//TRANSLIT %s", filename),会被当成一个完整参数传给iconv,等效于在控制台执行:

iconv "-f WINDOWS-1251" "-t UTF-8//TRANSLIT 3_win1251.csv" "-o ./convert_3_win1251.csv"

此时iconv会把-t的参数值识别为UTF-8//TRANSLIT 3_win1251.csv,而非将UTF-8//TRANSLIT作为目标编码、3_win1251.csv作为输入文件,因此不会生成输出文件;但因为命令本身没有语法错误,所以返回exit status 0。

修复方案

将每个命令参数拆分为独立的切片元素,不要合并带空格的参数:

func main() {
    from := "WINDOWS-1251"
    filename := "3_win1251.csv"
    // 每个参数单独传递,确保和控制台执行的命令参数完全一致
    cmd := exec.Command(
        "iconv",
        "-f", from,
        "-t", "UTF-8//TRANSLIT",
        filename,
        "-o", fmt.Sprintf("./convert_%s", filename),
    )
    log.Println(cmd.String())
    err := cmd.Run()
    if err != nil {
        log.Fatal(err)
    }

    log.Println(cmd.ProcessState)
}

这样exec.Command会正确传递每个参数给iconv,和手动在控制台执行的命令逻辑一致,就能正常生成转换后的目标文件。

内容的提问来源于stack exchange,提问作者Aleksey Budaev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:40:14