CMD下執(zhí)行Go出現中文亂碼的解決方法
1、報錯信息如下

2、原因分析
因為Go的編碼是UTF-8,而CMD的活動頁是cp936(GBK),因此產生亂碼。在中文Windows系統(tǒng)中,如果一個文本文件是UTF-8編碼的,那么在CMD.exe命令行窗口(所謂的DOS窗口)中不能正確顯示文件中的內容。在默認情況下,命令行窗口中使用的代碼頁是中文或者美國的,即編碼是中文字符集或者英文字符集。
3、解決方法
golang處理中文時默認是utf8,當遇到其他如GBK字符是就會出現亂碼,此處介紹golang 官方golang.org/x/text/encoding/simplifiedchinese包下的編碼轉換
simplifiedchinese.GB18030.NewDecoder().Bytes()
4、封裝處理亂碼方法
package main
import "golang.org/x/text/encoding/simplifiedchinese"
type Charset string
const (
UTF8 = Charset("UTF-8")
GB18030 = Charset("GB18030")
)
func ConvertByte2String(byte []byte, charset Charset) string {
var str string
switch charset {
case GB18030:
decodeBytes, _ := simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
str = string(decodeBytes)
case UTF8:
fallthrough
default:
str = string(byte)
}
return str
}
5、解決亂碼完整代碼
package main
import (
"bytes"
"fmt"
"golang.org/x/text/encoding/simplifiedchinese"
"os"
"os/exec"
)
type Charset string
const (
UTF8 = Charset("UTF-8")
GB18030 = Charset("GB18030")
)
func ConvertByte2String(byte []byte, charset Charset) string {
var str string
switch charset {
case GB18030:
decodeBytes, _ := simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
str = string(decodeBytes)
case UTF8:
fallthrough
default:
str = string(byte)
}
return str
}
//arg 執(zhí)行的bat文件完整路徑
//返回錯誤信息及消息提示
func ExecCommand(arg string) (error, string) {
c := exec.Command("cmd", "/C", arg)
w := bytes.NewBuffer(nil)
c.Stderr = w
message := "執(zhí)行" + arg + "文件抽取數據成功"
_, err1 := os.Stat(arg)
var err error
//判斷文件是否存在
if err1 != nil {
err := c.Run()
if err != nil {
fmt.Printf("Run returns: %s\n", err)
}
//處理中文亂碼
garbledStr := ConvertByte2String(w.Bytes(), GB18030)
message = err1.Error() + garbledStr
//文件不存在并且執(zhí)行報錯
return err, message
} else {
err = c.Run()
if err != nil {
//處理中文亂碼
garbledStr := ConvertByte2String(w.Bytes(), GB18030)
//文件存在 但執(zhí)行bat文件報錯
return err, garbledStr
}
}
//文件存在并且執(zhí)行bat文件成功
return err, message
}
到此這篇關于CMD下執(zhí)行Go出現中文亂碼的解決方法的文章就介紹到這了,更多相關CMD執(zhí)行Go中文亂碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

