在 Go 里日志输出出现乱码,通常不是 Go 本身的问题,而是编码、终端、输出方式不匹配导致的。下面按常见场景给你排查和解决方案。
?? 或 乱码CMD
chcp 65001
PowerShell
chcp 65001
然后重新运行程序。
如果你用的是:
import (
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"io/ioutil"
)
func gbkToUtf8(s []byte) ([]byte, error) {
return ioutil.ReadAll(transform.NewReader(
bytes.NewReader(s),
simplifiedchinese.GBK.NewDecoder(),
))
}
log 标准库log.Println("中文日志")
✅ 没问题,只要终端支持 UTF-8
logrus / zap / zerologlogrus.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
})
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("中文日志")
✅ 这些库默认 UTF-8,不乱码
✅ 用 UTF-8 编码写文件
f, _ := os.Create("log.txt")
defer f.Close()
writer := bufio.NewWriter(f)
writer.WriteString("中文日志\n")
writer.Flush()
然后:
| 检查项 | 是否 |
|---|---|
| Go 源码是 UTF-8 | ✅ |
| 终端支持 UTF-8 | ✅ |
| 日志字符串本身是 UTF-8 | ✅ |
| 文件用 UTF-8 打开 | ✅ |
fmt.Println("中文测试")
如果你愿意,可以把:
发出来,我可以精准定位是哪一步导致的。