在 Debian 上用 Go 程序出现日志乱码,通常不是 Go 本身的问题,而是终端编码 / 区域设置(locale)/ 输出内容编码不一致导致的。下面按常见原因逐步排查和解决。
在终端执行:
echo "中文测试"
locale
如果看到:
LANG=
LC_ALL=
或者
LC_CTYPE="POSIX"
中文一定会乱码。
sudo apt update
sudo apt install locales
sudo dpkg-reconfigure locales
勾选:
en_US.UTF-8
zh_CN.UTF-8
然后选默认 locale 为 en_US.UTF-8(推荐)。
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
写入环境变量(推荐):
echo 'export LANG=en_US.UTF-8' >> ~/.bashrc
echo 'export LC_ALL=en_US.UTF-8' >> ~/.bashrc
测试:
printf '中文\n'
确保你的 .go 文件是 UTF-8 无 BOM:
file main.go
应显示:
main.go: UTF-8 Unicode text
如果是:
ISO-8859 / GBK
用编辑器转成 UTF-8。
package main
import (
"log"
)
func main() {
log.SetFlags(log.LstdFlags)
log.Println("中文日志测试")
}
只要系统是 UTF-8,这里不会乱码。
cat app.log
如果终端是 UTF-8 但文件是 GBK,就会乱。
解决:
iconv -f GBK -t UTF-8 app.log > app_utf8.log
如果是 Docker 容器:
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
或者:
ENV LANG=en_US.UTF-8
| 项目 | 是否正确 |
|---|---|
| Debian locale = UTF-8 | ✅ |
| 终端编码 = UTF-8 | ✅ |
| Go 文件 = UTF-8 | ✅ |
| 日志文件 = UTF-8 | ✅ |
| Docker ENV 设置 | ✅ |
如果你愿意,可以把:
locale 输出发出来,我可以直接帮你定位是哪一层出的问题。