在 Linux 下用 C++ 出现乱码 / 异常,通常不是“程序崩了”,而是字符编码不一致导致的。下面按最常见原因给你系统梳理一下。
例如:
结果:
cout << "中文" << endl;
显示乱码
✅ 解决:
locale
查看终端编码,确保:
LANG=zh_CN.UTF-8
统一为 UTF-8 是最稳妥的。
GCC 默认按 UTF-8 解释源文件。
如果文件是 GBK:
file main.cpp
# main.cpp: ISO-8859 text
✅ 解决方式一(推荐):
iconv -f GBK -t UTF-8 main.cpp -o main_utf8.cpp
✅ 解决方式二(不推荐但可用):
g++ -finput-charset=GBK main.cpp
比如:
✅ 解决:
export LANG=zh_CN.UTF-8char* 不等于“正确显示”const char* s = "中文";
这只是字节序列,是否乱码取决于:
✅ 正确做法(现代 C++):
#include <string>
using namespace std::string_literals;
auto s = u8"中文"s;
wchar_t / wcout 用错反而更乱wcout << L"中文"; // 经常无效
Linux 下 wchar_t 是 UTF-32,但终端不支持直接输出。
✅ 推荐:
std::stringofstream f("a.txt");
f << "中文";
如果文件是 GBK 环境打开 → 乱码
✅ 解决:
throw runtime_error("打开文件失败");
如果终端是 GBK,UTF-8 中文异常 → 乱码
✅ 解决:
locale
file your.cpp
echo $LANG
确保三者一致:
#include <iostream>
#include <string>
int main() {
std::string s = u8"中文输出";
std::cout << s << std::endl;
return 0;
}
编译:
g++ -std=c++17 main.cpp
如果你愿意,可以贴:
我可以直接帮你定位是哪一种乱码。