温馨提示×

Strings输出乱码怎么解

小樊
37
2026-08-02 08:43:04
栏目: 编程语言

Strings(通常指 C/C++ 里的 std::string / C 字符串)输出乱码,常见原因和解决办法如下,你可以对照排查。


一、最常见原因

1️⃣ 编码不一致(最常见)

现象:中文、日文等字符变成问号 ? 或乱码。

原因

  • 字符串本身是 UTF-8
  • 终端 / 控制台用的是 GBK / ANSI

解决办法

  • 统一编码为 UTF-8
  • 或让终端使用 UTF-8

Windows 控制台

#include <windows.h>
int main() {
    SetConsoleOutputCP(65001); // UTF-8
}

2️⃣ 字符串未正确结束(C 风格字符串)

现象:输出一堆乱码或程序崩溃

char s[] = {'a', 'b', 'c'};
printf("%s\n", s); // ❌ 没有 '\0'

正确写法

char s[] = {'a', 'b', 'c', '\0'};

char s[] = "abc";

3️⃣ 使用了错误的字符串类型

现象std::string 显示乱码

std::string s = u8"中文";
std::cout << s << std::endl; // 可能乱码

推荐写法

#include <iostream>
#include <string>

int main() {
    SetConsoleOutputCP(65001);
    std::string s = u8"中文";
    std::cout << s << std::endl;
}

4️⃣ 宽字符 / 窄字符混用

现象wstring 输出乱码

std::wstring s = L"中文";
std::cout << s; // ❌

正确方式

#include <iostream>
#include <io.h>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wstring s = L"中文";
    std::wcout << s << std::endl;
}

5️⃣ 文件编码问题(源码乱码)

现象:字符串常量本身就是乱码

检查

  • 源码文件编码是否为 UTF-8
  • VS / CLion / VSCode 是否一致

6️⃣ 内存越界 / 野指针

char* p = nullptr;
printf("%s", p); // ❌

确保字符串内存有效


二、快速自检清单 ✅

  • [ ] 字符串是否以 \0 结尾
  • [ ] 编码是否统一(UTF-8 / GBK)
  • [ ] 是否混用 string / wstring
  • [ ] 控制台是否支持 UTF-8
  • [ ] 源码文件编码是否正确

三、如果你愿意,我可以更精确帮你

你可以直接贴: 1️⃣ 使用的语言(C / C++ / Java / Python)
2️⃣ 输出代码
3️⃣ 乱码截图或示例

我可以 直接帮你改到能跑 ✅

0