怎么解决CMD下执行Go出现中文乱码问题?
2024-10-22 04:54:45
目录
- 1、报错信息如下
- 2、原因分析
- 3、解决方法
- 4、封装处理乱码方法
- 5、解决乱码完整代码
1、报错信息如下
2、原因分析
因为Go的编码是UTF-8,而CMD的活动页是cp936(GBK),因此产生乱码。在中文Windows系统中,如果一个文本文件是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 执行的bat文件完整路径
//返回错误信息及消息提示
func ExecCommand(arg string) (error, string) {
c := exec.Command("cmd", "/C", arg)
w := bytes.NewBuffer(nil)
c.Stderr = w
message := "执行" + 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
//文件不存在并且执行报错
return err, message
} else {
err = c.Run()
if err != nil {
//处理中文乱码
garbledStr := ConvertByte2String(w.Bytes(), GB18030)
//文件存在 但执行bat文件报错
return err, garbledStr
}
}
//文件存在并且执行bat文件成功
return err, message
}
最新文章
- Android中如何设置RadioButton在文字的右边,图标在左边
- Android复制assets目录下的图片到内存
- Command
- UVa10562 Undraw the Trees
- Swift3.0 更新后出现比较运算符方法
- SQL 查询字段为值不为空
- Vue.jsbrowserify项目模板
- XBOX360 硬盘玩游戏
- MT5基础知识
- 小星星的php
- iOS学习——Quartz2D学习之UIKit绘制
- 在webstorm中配置sass的自动编译,并且可以指定编译后的css的目录.
- python 调用js代码
- 一起学libcef--搭建自己的libcef运行环境(Win32程序,错误C2220解决方案)
- WCF、WebAPI、WCFREST、WebService之间的区别【转载】
- 微信服务器配置令牌(Token)
- React Router基础教程
- Qt编写websocketpp客户端
- [LeetCode&;Python] Problem 700. Search in a Binary Search Tree
- Spring.NET学习笔记7——依赖对象的注入(基础篇) Level 200