CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法
1、報(bào)錯(cuò)信息如下

2、原因分析
因?yàn)镚o的編碼是UTF-8,而CMD的活動(dòng)頁(yè)是cp936(GBK),因此產(chǎn)生亂碼。在中文Windows系統(tǒng)中,如果一個(gè)文本文件是UTF-8編碼的,那么在CMD.exe命令行窗口(所謂的DOS窗口)中不能正確顯示文件中的內(nèi)容。在默認(rèn)情況下,命令行窗口中使用的代碼頁(yè)是中文或者美國(guó)的,即編碼是中文字符集或者英文字符集。
3、解決方法
golang處理中文時(shí)默認(rèn)是utf8,當(dāng)遇到其他如GBK字符是就會(huì)出現(xiàn)亂碼,此處介紹golang 官方golang.org/x/text/encoding/simplifiedchinese包下的編碼轉(zhuǎn)換
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文件完整路徑
//返回錯(cuò)誤信息及消息提示
func ExecCommand(arg string) (error, string) {
c := exec.Command("cmd", "/C", arg)
w := bytes.NewBuffer(nil)
c.Stderr = w
message := "執(zhí)行" + arg + "文件抽取數(shù)據(jù)成功"
_, 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í)行報(bào)錯(cuò)
return err, message
} else {
err = c.Run()
if err != nil {
//處理中文亂碼
garbledStr := ConvertByte2String(w.Bytes(), GB18030)
//文件存在 但執(zhí)行bat文件報(bào)錯(cuò)
return err, garbledStr
}
}
//文件存在并且執(zhí)行bat文件成功
return err, message
}
到此這篇關(guān)于CMD下執(zhí)行Go出現(xiàn)中文亂碼的解決方法的文章就介紹到這了,更多相關(guān)CMD執(zhí)行Go中文亂碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go底層channel實(shí)現(xiàn)原理及示例詳解
這篇文章主要介紹了Go底層channel實(shí)現(xiàn)原理及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
golang包循環(huán)引用的幾種解決方案總結(jié)
golang有包循環(huán)引用問(wèn)題,用過(guò)的應(yīng)該都知道,下面這篇文章主要給大家介紹了關(guān)于golang包循環(huán)引用的幾種解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Go 并發(fā)編程Goroutine的實(shí)現(xiàn)示例
Go語(yǔ)言中的并發(fā)編程主要通過(guò)Goroutine和Channel來(lái)實(shí)現(xiàn),本文就來(lái)介紹一下Go 并發(fā)編程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流的實(shí)現(xiàn)
本文主要介紹了Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Go語(yǔ)言實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(jī)數(shù)詳解
這篇文章主要介紹了Go語(yǔ)言如何實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(jī)數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Golang實(shí)現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式
本文介紹了如何使用Golang讀取Excel文件并將其轉(zhuǎn)換為JSON格式,通過(guò)安裝excelize依賴和創(chuàng)建readExcelToJSON方法,可以實(shí)現(xiàn)這一功能,如果需要轉(zhuǎn)換數(shù)據(jù)類型,可以修改相應(yīng)的代碼,需要的朋友可以參考下2025-03-03

