下面从常见原因 → 排查步骤 → 解决方案三个层面,帮你解决 Golang 在 CentOS 上日志中文/特殊字符乱码(编码异常) 的问题。
CentOS 默认有时是:
LANG=C
LC_ALL=C
这会导致:
fmt.Println / log 输出乱码os.WriteFile如:
Go 源码默认 UTF-8,一般不是代码问题。
locale
正常应看到:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
如果是:
LANG=C
❌ 就是问题根源
file your.log
或:
enca your.log
package main
import "fmt"
func main() {
fmt.Println("中文测试")
}
运行:
go run main.go
如果终端乱码 → 终端问题
如果文件乱码 → 写入/系统编码问题
sudo localedef -i en_US -f UTF-8 en_US.UTF-8
编辑:
sudo vi /etc/locale.conf
内容:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
生效:
source /etc/locale.conf
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
go run main.go
或在 systemd 服务中:
[Service]
Environment=LANG=en_US.UTF-8
Environment=LC_ALL=en_US.UTF-8
文件 → 属性 → 终端 → 编码 → UTF-8Session Options → Terminal → Appearance → UTF-8logger, _ := zap.NewProduction()
logger.Info("中文日志测试")
Zap 默认 UTF-8,不乱码。
❌ 在代码里强行转 GBK
❌ 修改 Go 源码编码
✅ 系统 Locale 才是根因
你可以贴:
locale 输出我可以直接帮你定位到具体哪一步出问题。