温馨提示×

Go日志输出乱码怎么解决

小樊
46
2026-08-23 17:41:28
栏目: 编程语言

在 Go 里日志输出出现乱码,通常不是 Go 本身的问题,而是编码、终端、输出方式不匹配导致的。下面按常见场景给你排查和解决方案。


一、最常见原因:终端编码不一致(Windows 最常见)

现象

  • 控制台中文变成 ??乱码
  • 在 Windows CMD / PowerShell 中尤其明显

原因

  • Go 默认输出 UTF-8
  • Windows 终端默认是 GBK

解决方案

✅ 方案 1:修改终端编码(推荐)

CMD

chcp 65001

PowerShell

chcp 65001

然后重新运行程序。


✅ 方案 2:IDE / 编辑器设置

如果你用的是:

  • VS Code
    • 打开终端
    • 设置终端编码为 UTF-8
  • GoLand
    • Settings → Editor → File Encodings → 全部 UTF-8

二、日志中字符串本身是乱码(文件/网络)

现象

  • 日志文件里中文乱码
  • 日志来自数据库 / 网络 / 文件

原因

  • 读取的数据不是 UTF-8
  • 比如数据库是 GBK、ISO-8859-1

解决方案

✅ 显式转码(如 GBK → UTF-8)

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

三、日志库本身的问题

1️⃣ 使用 log 标准库

log.Println("中文日志")

没问题,只要终端支持 UTF-8


2️⃣ 使用 logrus / zap / zerolog

logrus

logrus.SetFormatter(&logrus.TextFormatter{
    FullTimestamp: true,
})

zap

logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("中文日志")

✅ 这些库默认 UTF-8,不乱码


四、输出到文件时乱码

原因

  • 文件编码不是 UTF-8
  • Windows 记事本默认 ANSI

解决方案

用 UTF-8 编码写文件

f, _ := os.Create("log.txt")
defer f.Close()

writer := bufio.NewWriter(f)
writer.WriteString("中文日志\n")
writer.Flush()

然后:

  • VS Code / Notepad++ 打开
  • 编码选择 UTF-8

五、快速自检清单 ✅

检查项 是否
Go 源码是 UTF-8
终端支持 UTF-8
日志字符串本身是 UTF-8
文件用 UTF-8 打开

六、最快判断方法

fmt.Println("中文测试")
  • 如果乱码 → 终端问题
  • 不乱码 → 日志库 / 数据源问题

如果你愿意,可以把:

  • 操作系统
  • 终端类型
  • 日志库
  • 乱码截图或示例

发出来,我可以精准定位是哪一步导致的。

0