VS-c++解决控制台乱码/读取和显示中文问题

一. 问题

众所周知,计算机存储的都是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)。

### C++读取汉字输出乱码解决方案 在C++中处理中文字符时,可能会因为编码不一致而导致乱码问题。以下是几种常见的解决方法: #### 方法一:修改文件编码格式 如果`.txt`文件是以UTF-8编码保存,则可能需要将其转换为ANSI或其他兼容Windows系统的编码格式。可以通过以下步骤实现: 1. 打开目标`.txt`文件。 2. 转到菜单栏中的“文件”,选择“另存为”选项。 3. 在弹出窗口底部找到“编码”设置,默认可能是UTF-8。 4. 将其更改为ANSI编码并保存。 这种方法适用于简单的文本文件操作场景[^4]。 #### 方法二:调整控制台代码页 对于基于Windows平台的应用程序,在运行过程中动态更改控制台的代码页可以帮助正确显示中文字符。具体做法是在程序启动阶段调用`SetConsoleOutputCP()`函数来设定合适的代码页(如GBK对应的936)。例如: ```cpp #include <windows.h> int main() { SetConsoleOutputCP(936); // 设置控制台输出代码页为GBK } ``` 此外还可以通过命令行指令完成相同效果: ```cpp system("chcp 936"); ``` 此法特别适合那些仅需短暂切换至特定语言环境下的小型应用场合[^5]。 #### 方法三:利用宽字符串支持Unicode 当面对更加复杂的国际化需求或者希望保持源数据原始编码形式而不做任何预处理的情况下,推荐采用宽字符类型(`wchar_t`)以及相应输入/输出流类库来进行跨平台友好型编程实践。下面给出一段示范代码片段展示如何运用这些工具安全高效地加载含有多国文字内容的数据资源: ```cpp #include <locale> #include <codecvt> #include <fstream> std::wstring loadFileContent(const char* filename){ std::wifstream fileStream(filename); fileStream.imbue(std::locale(fileStream.getloc(),new std::codecvt_utf8<wchar_t>)); std::wstring content((std::istreambuf_iterator<wchar_t>(fileStream)), std::istreambuf_iterator<wchar_t>()); return content; } ``` 上述例子展示了怎样借助标准模板库(STL)内部定义好的组件轻松达成既定目的——即无论外部存储介质采用了何种具体的字节序列表示方案,只要它们遵循普遍接受的标准协议比如UTF-8之类的,那么我们就能依靠内置转化机制自动适配从而获得预期的结果[^3]。 #### 方法四:确保编译器配置一致性 最后值得注意的一点在于确认整个构建流程当中涉及到的所有环节都维持着统一的行为准则。这意味着不仅要关注最终执行产物的表现特性,同时也应该仔细审查前期准备工作中是否存在潜在隐患因素干扰正常运作过程。比如说Visual Studio IDE环境下新建工程项目之时往往会给用户提供多种初始参数选项可供挑选定制化体验;此时如果不小心选择了错误的语言区域关联项或者其他相关属性值的话也很容易引发后续一系列连锁反应造成不必要的麻烦事端发生。因此建议开发者们养成良好习惯每次创建新工程之前都要认真核查一遍各项基础设定是否合理恰当无误之处再继续往下推进其余工作事项安排计划表单列表清单等等相关内容细节方面考虑周全些总归是有益处多多的好事情嘛??[^1]! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值