go中[]byte转string后出现中文乱码的解决方法

482 阅读1分钟

最近使用go的exec执行命令获取返回值时,发现返回的结果中带有乱码

image.png

代码如下

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))
}

image.png

运行结果,成功显示中文