vs2017使用cout乱码,使用printf正常输出

问题描述

vs2017使用cout乱码,使用printf正常输出

问题出现的平台版本及自己尝试过哪些方法

修改vs源文件为gbk和utf但还是乱码

相关代码

#include<cstdio>
#include<iostream>
int main() {
    std::cout << "我" << std::endl;
    printf("我是\n");
    system("pause");
    return 0;
}

结果

clipboard.png

阅读 8.1k
4 个回答

没有遇到过这种情况。你调试一下看看。

字符集设置改成多字符试试看。
General->Character Set->Use Multi-Byte Character Set.(VS2010)

在 C++ 中,除了 ASCII 字符外的字符为宽字符,需要使用 L 标识。而宽字符流有特定的输出流,为 std::wcout。所以,正确的输出方式为 std::wcout << L"你好" << std::endl

另外,还需要涉及到 std::locale 的概念。std::locale 代表地域各个设定的集合。locale 文档

每个输入输出流可以与一个 std::locale 进行绑定,默认绑定为 std::locale("C")。此处使用 std::wcout.imbue( locale ),需要设定的地域为 zh-cn,我没有查到相关的内容,这个地域字符串可能跟环境有关系。

最终代码为:

#include <cstdio>
#include <locale>
#include <string>
#include <iostream>

int main() {
    auto old_locale = std::wcout.imbue(std::locale("zh-cn"));
    std::wcout << L"你好" << std::endl;

    std::cout << "old locale: " << old_locale.name() << std::endl;
    auto new_locale = std::wcout.imbue(old_locale);
    std::cout << "new locale: " << new_locale.name() << std::endl;

    printf("你好\n");

    system("pause");
}

输出为:

你好
old locale: C
new locale: zh-cn
你好

这部分内容较繁杂,我也没有很了解,希望能对你有帮助。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏