Debian 上 Golang 程序日志出现乱码,通常不是 Go 本身的问题,而是字符编码 / 终端环境 / 输出方式不一致导致的。下面按常见原因逐一说明,并给出解决办法。
Debian 默认可能不是 UTF-8(尤其老系统或最小化安装)。
locale
如果看到:
LANG=
LC_ALL=
LANG=C
或包含 ASCII、POSIX,就容易出现乱码。
设置 UTF-8 locale:
sudo apt install locales
sudo dpkg-reconfigure locales
# 选择 en_US.UTF-8 或 zh_CN.UTF-8
然后:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
✅ 推荐写入:
~/.bashrc
/etc/environment
用 file 检查:
file main.go
如果不是 UTF-8:
iconv -f GBK -t UTF-8 main.go > main_utf8.go
确保:
string(UTF-8)✅ 正确示例:
log.Println("中文日志")
❌ 错误示例(GBK 字符串):
s := []byte{0xd6, 0xd0} // GBK
log.Println(string(s))
即使服务器是对的,客户端错了也会乱码。
文件 → 属性 → 终端 → 编码 = UTF-8Window → Translation → UTF-8如果程序作为 service 运行:
journalctl -u your-service
LANG 没设置时,Go 可能用 C在 service 文件加:
[Service]
Environment=LANG=en_US.UTF-8
Environment=LC_ALL=en_US.UTF-8
然后:
sudo systemctl daemon-reload
sudo systemctl restart your-service
如果你用:
log.SetOutput(file)
然后 Windows 打开文件乱码:
✅ 解决:
locale 是否为 UTF-8LANGpackage main
import "log"
func main() {
log.SetFlags(log.LstdFlags)
log.Println("中文日志测试")
}
如果这里都乱码,99% 是环境编码问题。
如果你愿意,可以贴:
locale 输出我可以直接帮你定位是哪一层的问题。