go程序中文乱码主因是源文件、终端、http响应或文件读写四环节编码未对齐;需确保源文件无bom utf-8、终端设utf-8、http/文件显式解码,而非依赖自动猜测。

Go 程序输出中文乱码,90% 是因为源文件、终端、HTTP 响应或文件读写这四个环节中至少有一环编码没对齐——不是 Go 语言的问题,而是字节流和解码预期不匹配。
Go 源文件保存必须是无 BOM 的 UTF-8
Windows 记事本默认“另存为 → ANSI”实际是 GBK,Go 编译器不会报错,但字符串字面量在运行时就是损坏的字节。VS Code / GoLand 右下角必须显示 UTF-8(不是 UTF-8 with BOM),点击后选「Save with Encoding」强制重存。
已有文件检查 BOM:xxd main.go | head -1,若开头是 ef bb bf,用 sed -i '1s/^\xef\xbb\xbf//' main.go 去掉。Go 不需要也不识别 BOM。
Windows 终端(CMD/PowerShell)必须设为 UTF-8 或程序适配终端
CMD 默认代码页是 936(GBK),而 Go 输出的是 UTF-8 字节流,终端强行按 GBK 解,必然乱码。
- 临时方案:CMD 中先执行
chcp 65001,再go run main.go - PowerShell 必须加:运行前执行
$OutputEncoding = [System.Text.Encoding]::UTF8 - 不想改终端?让程序输出 GBK:
golang.org/x/text/encoding/simplifiedchinese提供GB18030编码器,用transform.Writer包裹os.Stdout即可
读取网页或文件时不能依赖 bufio.ReadString 自动猜编码
bufio.NewReader(f).ReadString('\n') 返回的是原始字节流,它不做任何编码转换。如果文件是 GBK,你拿到的就是 GBK 字节,当它被当 UTF-8 字符串打印,就乱。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
正确做法是显式解码:
- 从 HTTP 响应头读
Content-Type,提取charset=gbk等信息 - 用
golang.org/x/text/encoding/simplifiedchinese.GBK.NewDecoder()构造transform.Reader - 再用
ioutil.ReadAll或io.Copy读取解码后的内容
GoLand 控制台乱码要单独处理终端编码设置
GoLand 内置终端默认不继承系统 UTF-8 设置,即使你已执行 chcp 65001,它也可能仍用旧代码页。
解决路径:File → Settings → Tools → Terminal → Shell path,在启动命令前手动注入编码设置:
- CMD:改成
cmd.exe /k chcp 65001 > nul - PowerShell:改成
powershell.exe -Command "$OutputEncoding = [System.Text.Encoding]::UTF8; $Host.UI.RawUI.BackgroundColor = 'Black'; Clear-Host; Invoke-Expression '$args' -Args $args"
更稳妥的做法仍是让 Go 程序自己做编码转换——终端配置容易遗漏,而程序内解码逻辑是确定的。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










