一. 问题
众所周知,计算机存储的都是0-1序列。
是编码,解释了0-1序列,才使得我们能看到各种各样的符号和文字。
可惜不同平台的编码是不一样的,在我这里解析是“你好,世界”,在你那里可能就变成了“烫烫烫”。
乱码问题就产生了。
二. 尝试
怎么解决呢?转换编码使其一致不就行了。
易知,一般控制台项目有三种编码。(这很重要)
- 保存项目文件的编码
- 控制台输入符号的编码
- 控制台显示符号的编码
1. 设置项目文件的编码
对于VS,可以调出高级保存设置的按钮,进行项目编码的选择。(按钮出现的位置随便调)
这会影响什么呢?比如这个
std::cout<<"哈哈哈";
会影响那些写死,不可改的文字输出。你必须得保证项目编码和显示屏使用的编码一致,才不会出现乱码问题。这也就是我们常说的 硬编码 ,是不推荐的写法。
2. 设置控制台输入和输出符号的编码
这里一起介绍了,毕竟两者很相似。
//设置编码
#include <Windows.h>
static bool SetEncode(int EncodeId=936)
{
return SetConsoleCP(EncodeId) && SetConsoleOutputCP(EncodeId);
}
EncodeId 是代码页,设置它等于设置我们指定的编码格式。
SetConsoleCP() 设置控制台输入时使用的编码。
SetConsoleOutputCP() 设置控制台输出时使用的编码。
右键控制台属性,可见当前控制台输出使用的编码。
三. 解决?
按道理,三者编码一致,问题就解决了,但是实际测试的时候发现
std::cin 在读取utf-8编码的时候会出错?可能是自己在Window区域设置中使用了utf-8导致,毕竟控制台乱码的问题之前并未出现,但是不必深究了,控制台建议使用gbk编码。而对于wcin,wcout,wstring,似乎对该问题的解决不起本质上的作用,也就没有使用。
综上,三者均使用gbk(936)编码,当然,utf-8没问题的,建议utf-8(65001)。