C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++中文输出乱码解决

一文带你彻底搞定C++中文输出乱码的问题

作者:m0_74823364

这篇文章主要为大家详细介绍了C++中文输出乱码的相关解决方法,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下

1. 问题背景

今天在群里看到一段挺有趣的 C++ 代码,用模板方法模式描述传统放羊娃与现代放羊娃的一生:

每天放羊 → 卖羊赚钱 → 结婚 → 生孩子 → 孩子继续放羊……

代码写得没毛病,可一运行,终端里却蹦出一堆“口口口”或“烫烫烫”的乱码。

很多同学第一反应是“是不是代码写错了?”

其实,90% 的 C++ 中文乱码都不是代码问题,而是“编码不一致”导致的显示错位

2. 复现场景

把简化后的代码贴出来,方便大家复现:

#include <iostream>
 
int main() {
    std::cout << "每天放羊..." << std::endl;
    std::cout << "卖羊赚钱..." << std::endl;
    std::cout << "用钱娶媳妇..." << std::endl;
    return 0;
}

期望输出:

每天放羊...
卖羊赚钱...
用钱娶媳妇...

实际输出(Windows 默认 cmd):

ÿþÿÿÿÿÿÿÿÿ...
¡¡¡¡...
ÓÃǮȢϱ¸¾...

3. 乱码成因

一句话总结:“源文件编码” ≠ “控制台编码”

环节常见编码
源文件(.cpp)UTF-8(无 BOM)
Windows 控制台默认代码页 936(GBK)

当编译器把 UTF-8 下的 (0xE6 0xAF 0x8F)原封不动地交给控制台时,控制台按 GBK 去解码,于是 0xE6AF 被当成一个 GBK 字符,自然面目全非。

4. 解决方案

方案一:让控制台使用 UTF-8(推荐)

main() 里加两行,仅 Windows 有效

#ifdef _WIN32
#include <cstdlib>
#endif
 
int main() {
#ifdef _WIN32
    system("chcp 65001");      // 切到 UTF-8 代码页
#endif
    std::cout << "每天放羊..." << std::endl;
    ...
}

方案二:让源文件使用 GBK

用记事本 / VSCode / CLion 把 .cpp 另存为 → 编码选 GBK/ANSI

无需改动代码,直接编译运行即可。

缺点:undefined• 换到 Linux/macOS 或 CI 环境容易再次乱码;undefined• 团队协作时需统一编码;undefined• 与 CMake、Clang-Tidy 等工具链默认 UTF-8 冲突。

方案三:IDE 一键设置

IDE操作路径
Visual Studio 2022文件 → 另存为 → 保存按钮下拉 → “编码保存” → 简体中文(GB2312)
VSCode右下角“UTF-8” → 重新打开带编码 / 另存为带编码 → GB2312
CLionSettings → Editor → File Encodings → Global/Project Encoding → GBK

5. 完整示例(方案一)

#include <iostream>
 
#ifdef _WIN32
#include <cstdlib>
#endif
 
class ShepherdBoyLife {
public:
    void liveLife() {
        herdSheep();
        sellSheep();
        marry();
        haveChild();
        childGrowsUp();
    }
    virtual ~ShepherdBoyLife() = default;
 
protected:
    void herdSheep()   { std::cout << "每天放羊...\n"; }
    void sellSheep()   { std::cout << "卖羊赚钱...\n"; }
    virtual void marry() = 0;
    virtual void haveChild() = 0;
    void childGrowsUp() {
        std::cout << "孩子长大了...\n";
    }
};
 
class TraditionalShepherdBoy : public ShepherdBoyLife {
protected:
    void marry()      override { std::cout << "用钱娶媳妇...\n"; }
    void haveChild()  override { std::cout << "生儿育女...\n"; }
};
 
int main() {
#ifdef _WIN32
    system("chcp 65001 > nul");
#endif
 
    std::cout << "=== 传统放羊娃的一生 ===\n";
    TraditionalShepherdBoy boy;
    boy.liveLife();
    return 0;
}

6. 延伸阅读

到此这篇关于一文带你彻底搞定C++中文输出乱码的问题的文章就介绍到这了,更多相关C++中文输出乱码解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文