问题描述
vs2017使用cout乱码,使用printf正常输出
问题出现的平台版本及自己尝试过哪些方法
修改vs源文件为gbk和utf但还是乱码
相关代码
#include<cstdio>
#include<iostream>
int main() {
std::cout << "我" << std::endl;
printf("我是\n");
system("pause");
return 0;
}
vs2017使用cout乱码,使用printf正常输出
修改vs源文件为gbk和utf但还是乱码
#include<cstdio>
#include<iostream>
int main() {
std::cout << "我" << std::endl;
printf("我是\n");
system("pause");
return 0;
}
在 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
你好
这部分内容较繁杂,我也没有很了解,希望能对你有帮助。
3 回答1.1k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
1 回答965 阅读✓ 已解决
2 回答511 阅读✓ 已解决
1 回答2k 阅读
1 回答1.2k 阅读
没有遇到过这种情况。你调试一下看看。