c语言控制台中文乱码

148 阅读1分钟

为什么会乱码?

  • 编码不匹配:你的代码里用中文字符串(比如"你好"),但编译器和控制台的编码不一致。
  • Windows控制台默认编码:Windows CMD默认用的是本地代码页(比如中国地区是CP936,即GBK),而不是UTF-8。
  • Linux/Mac通常没问题:这些系统默认多用UTF-8,乱码问题较少。

方法1:设置控制台编码为UTF-8
在代码里告诉Windows控制台使用UTF-8编码。

#include <stdio.h>
#include <windows.h>

int main() {
    SetConsoleOutputCP(936); // 设置为GBK
    printf("你好,马里奥!\n");
    return 0;
}
  • 适用环境:Windows。
  • 注意:需要保存代码文件为UTF-8格式(用VS Code或Notepad++保存时选“UTF-8 with BOM”)。
  • 效果:直接在Windows CMD或PowerShell里运行,中文应该正常显示。

方法2:用GBK编码(Windows传统方式)
如果不想用UTF-8,可以用Windows默认的GBK(CP936)。但这需要确保代码文件保存为GBK格式(不推荐,因为不通用)。

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, ""); // 设置本地化支持中文
    wprintf(L"你好,马里奥!\n"); // 用wprintf和L前缀
    return 0;
}
  • 缺点:代码文件必须保存为GBK,跨平台支持不好。

方法3:用宽字符(wchar_t)
C语言支持宽字符,可以处理中文,不依赖控制台编码。

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, ""); // 设置本地化支持中文
    wprintf(L"你好,马里奥!\n"); // 用wprintf和L前缀
    return 0;
}
  • 优点:跨平台兼容性好(Windows/Linux/Mac都行)。
  • 注意:用wprintf代替printf,字符串前加L表示宽字符。