【golang】执行cmd命令并解决中文乱码问题

发布于:2024-07-06 ⋅ 阅读:(142) ⋅ 点赞:(0)

参考代码

package main

import (
	"bufio"
	"fmt"
	"io"
	"os/exec"
	"syscall"
	"time"
	
	"golang.org/x/text/encoding/simplifiedchinese"
)

type charset string

const (
	UTF8    = charset("UTF-8")
	GB18030 = charset("GB18030")
)

// 对字符进行转码
func ByteToString(byte []byte, charset charset) string {
	var str string
	switch charset {
	case GB18030:
		var decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
		str = string(decodeBytes)
	case UTF8:
		fallthrough
	default:
		str = string(byte)
	}
	return str
}

// 封装一个函数来执行命令
func ExecCommand(commandName string, params []string, f func(str string)) {
	// 执行命令
	cmd := exec.Command(commandName, params...)
	cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
	// 输出
	stderr, _ := cmd.StderrPipe()
	stdout, _ := cmd.StdoutPipe()
	// 输出重定向
	if f != nil {
		StdOut(f, stderr, stdout)
	}
	// 执行cmd(非阻塞)
	cmd.Start()
}

// 标准输出
func StdOut(f func(str string), out ...io.Reader) {
	for _, r := range out {
		go func(reader io.Reader) {
			in := bufio.NewScanner(reader)
			for in.Scan() {
				rst := fmt.Sprintf("%s", ByteToString(in.Bytes(), "GB18030"))
				f(rst)
			}
		}(r)
	}
}

// 测试
func main() {
	ExecCommand("ping", []string{"127.0.0.1", "-t"}, func(str string) {
		fmt.Println(str)
	})
	time.Sleep(15 * time.Second)
}

运行效果如图所示
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到