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

参考代码

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有点心急.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值