在 Linux 下用 C++ 出现“乱码”,通常不是编译器问题,而是字符编码不一致导致的。下面按常见原因逐一说明,并给出解决方案。
Linux 下推荐源码使用 UTF-8(无 BOM)。
检查:
file main.cpp
如果看到:
main.cpp: ISO-8859 text
就可能是问题来源。
✅ 解决:
iconv -f GBK -t UTF-8 main.cpp > main_utf8.cpp
或用编辑器(VSCode / vim)转为 UTF-8。
即使源码是 UTF-8,终端不支持也会乱码。
查看终端编码:
locale
应看到:
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
如果不是:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
char* 字符串 ≠ Unicodecout << "中文";
是否乱码,取决于:
三者必须一致(推荐全是 UTF-8)。
wstring / wcout(容易踩坑)wcout << L"中文";
在 Linux 下需要设置 locale:
#include <locale>
setlocale(LC_ALL, "");
否则 wcout 可能什么都不输出或乱码。
g++ -finput-charset=UTF-8 -fexec-charset=UTF-8 main.cpp
✅ 推荐写法
ifstream fin("test.txt");
如果文件是 GBK,而程序按 UTF-8 读,就会乱码。
✅ 解决:
iconv / codecvt(C++17 前)确保:
[ ] 源码是 UTF-8
[ ] 终端 locale 是 UTF-8
[ ] g++ 使用 -finput-charset=UTF-8
[ ] 不使用 GBK 文件
[ ] 不混用 char / wchar_t
#include <iostream>
using namespace std;
int main() {
cout << "中文测试" << endl;
return 0;
}
编译:
g++ -finput-charset=UTF-8 main.cpp
./a.out
如果你愿意,可以告诉我:
我可以直接帮你定位到具体配置。