根本原因是windows终端默认gbk编码与go程序utf-8输出冲突,需同步配置goioencoding=utf-8、powershell的[console]::outputencoding=ut8、chcp 65001启动参数及中文字体,四者缺一不可。

Go 程序在 VSCode 集成终端里输出中文变成方块、问号或 ,根本不是 Go 源文件编码错了,而是 Windows 终端默认用 GBK(CP936)解码 Go 进程输出的 UTF-8 字节流——两者错配,必乱码。
为什么 go run 输出中文在终端里崩了
Go 默认以 UTF-8 编码写入 os.Stdout,但 Windows 的 PowerShell / CMD 启动时代码页是 936(GBK),它会强行用 GBK 解析那串 UTF-8 字节,结果就是“你好”变“浣犲ソ”。files.encoding 设成 utf8 对终端输出完全没影响,改它纯属白忙。
常见错误现象:
- VSCode 编辑器里中文注释/字符串显示正常,但终端一跑
go run main.go就出 - 手动在终端输
chcp 65001后再执行go run,立刻恢复正常 - 双击生成的
main.exe运行,哪怕源码是 UTF-8,也照样乱码——因为没走 VSCode 终端环境,chcp根本没机会执行
terminal.integrated.env.windows 必须加 GOIOENCODING
VSCode 不认 PYTHONIOENCODING 那套,Go 有自己的环境变量:GOIOENCODING。不设它,Go runtime 会默认读系统代码页(即 936),导致 fmt.Println("中文") 内部仍按 GBK 处理输出缓冲。
实操建议:
- 打开 VSCode 设置(
Ctrl + ,),搜settings.json,点击「在 settings.json 中编辑」 - 在
"terminal.integrated.env.windows"对象里补上:"GOIOENCODING": "utf-8" - 值必须是
utf-8(带短横、小写),写成UTF8或utf8都无效 - 如果该字段已存在其他变量(如
PYTHONIOENCODING),直接逗号续写,别漏大括号
PowerShell 用户还得动 $PROFILE
仅靠 GOIOENCODING 还不够:PowerShell 自身的 [Console]::OutputEncoding 默认仍是 System.Text.ASCIIEncoding 或 GBK,它会截断或重编码 Go 输出的原始字节流。
必须在 PowerShell 配置文件里固化设置:
- 终端里运行
notepad $PROFILE(若提示不存在,先执行Test-Path $PROFILE确认路径,再New-Item -Path $PROFILE -Force创建) - 在打开的文件末尾追加一行:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 - 保存后关闭所有终端,重启 VSCode——否则旧会话不生效
- 验证是否成功:新开终端,输入
[Console]::OutputEncoding,应返回System.Text.UTF8Encoding
字体和代码页启动参数不能少
即使编码全对齐,终端字体不支持中文,照样显示方块。而且 PowerShell 默认 profile 启动时不自动切代码页,得显式指定。
关键配置项:
- 在
settings.json中确保:"terminal.integrated.fontFamily": "Consolas, 'Microsoft YaHei', monospace"(优先选等宽中文字体) - 同时配置 PowerShell 启动参数,在
"terminal.integrated.profiles.windows"下为"PowerShell"加"args":
"PowerShell": {
"source": "PowerShell",
"args": ["-NoExit", "-Command", "chcp 65001 > $null"]
}
注意:chcp 65001 必须在 PowerShell 启动瞬间执行,放 $PROFILE 里可能因执行策略被跳过;而 args 是 shell 启动时最先跑的命令,最可靠。
真正容易被忽略的点是:Go 输出乱码不是单点问题,而是 GOIOENCODING、[Console]::OutputEncoding、终端启动代码页、字体支持这四者必须全部对齐,缺一不可——调其中三个,剩一个不对,还是乱码。











