解决终端编译时乱码问题
在 Windows 下,用 g++ 编译出的 exe 运行时中文乱码,99 % 是 “源码编码” 与 “终端编码” 不一致造成的。
下面给出 3 种最常用、最简单的解决方案,你任选其一即可。
方案 1:编译时直接把字符串转成 GBK(推荐)
把源码保存成 UTF-8,在编译命令里加 2 个参数:
g++ 3-最佳品牌.cpp -o 3-最佳品牌.exe \-finput-charset=UTF-8 \-fexec-charset=GBK
解释
-finput-charset=UTF-8
告诉 g++ 源码是 UTF-8。-fexec-charset=GBK
把程序里的字符串常量按 GBK 编码写入 exe。
cmd / PowerShell 默认就是 GBK,所以显示正常,无需改终端。
方案 2:不改源码编码,改终端为 UTF-8
- 源码保持 UTF-8,编译命令不加任何额外参数(或只加
-finput-charset=UTF-8
)。 - 运行前在终端敲:
chcp 65001
终端就被临时切到 UTF-8,随后运行 exe 即可正常显示中文。
(也可以把 chcp 65001 && 3-最佳品牌.exe
做成一条快捷命令)
方案 3:直接把源码改成 GBK
用 VS Code / Notepad++ → 另存为 → 编码选 GB2312/GBK,然后
g++ 3-最佳品牌.cpp -o 3-最佳品牌.exe
即可,默认就能匹配终端编码。
缺点:源码换平台(Linux/macOS)时可能出现反向乱码。
一键懒人法(VS Code tasks.json)
如果你用 VS Code 的 tasks.json 一键编译,把这两句插到 "args"
数组里即可:
"-finput-charset=UTF-8",
"-fexec-charset=GBK"
完整片段示例:
"args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.exe","-finput-charset=UTF-8","-fexec-charset=GBK"
]
保存后 Ctrl+Shift+B 重新编译,运行不再乱码。