最近使用go的exec执行命令获取返回值时,发现返回的结果中带有乱码
代码如下
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("cmd.exe", "/c", "dir")
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("cmd.Run: %s failed: %s\n", err, err)
}
fmt.Println(string(out))
}
一开始还很奇怪,因为[]byte转string类型是有中文处理的,也就是说,如果如果设置一个string变量里面有中文,那byte也是可以互转的
后来才发现,原来是编码的问题,[]byte类型默认转string是使用utf-8的,但是可能windows用的是gbk编码,所以要指定编码
package main
import (
"bytes"
"fmt"
"io"
"os/exec"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
)
func main() {
cmd := exec.Command("cmd.exe", "/c", "dir")
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("cmd.Run: %s failed: %s\n", err, err)
}
reader := transform.NewReader(bytes.NewReader(out), simplifiedchinese.GBK.NewDecoder())
d, err := io.ReadAll(reader)
if err != nil {
panic(err)
}
fmt.Println(string(d))
}
运行结果,成功显示中文