当前位置: 首页 > news >正文

windows 下控制台只能输入或输入输出的问题

首先,你要知道,

std::string

这东西高级得很,由于重载了运算符的的原因

std::cout

可以输出任何编码的东西,通常里来说 GBK 只能输入,UTF8 只能输出(只能写入 UTF8 文件),那我们直接融合一下不就好了?

本节讲 c++23, c++14 有其他的函数。
首先是,输入时采用 GBK 编码。

set_GBK();
std::cin >> s;
// std::cout << s << " " << s.size();

然后,我们直接转换字符串:

s = gbk_to_utf8(s);

再输出:

set_UTF8();
std::cout << s << " " << s.size();

其中函数的实现:

#include <bits/stdc++.h>
#include <windows.h>#ifndef _STRING_FORMATstd::string utf8_to_gbk(const std::string& utf8_str) {// UTF-8 到宽字符(UTF-16)int wide_size = MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, nullptr, 0);if (wide_size == 0) {return "";}std::wstring wide_str(wide_size, L'\0');if (MultiByteToWideChar(CP_UTF8, 0, utf8_str.c_str(), -1, wide_str.data(), wide_size) == 0) {return "";}// 宽字符到 GBKint gbk_size = WideCharToMultiByte(CP_ACP, 0, wide_str.c_str(), -1, nullptr, 0, nullptr, nullptr);if (gbk_size == 0) {return "";}std::string gbk_str(gbk_size - 1, '\0');if (WideCharToMultiByte(CP_ACP, 0, wide_str.c_str(), -1, gbk_str.data(), gbk_size, nullptr, nullptr) == 0) {return "";}return gbk_str;
}std::string gbk_to_utf8(const std::string& gbk_str) {// GBK 到宽字符(UTF-16)int wide_size = MultiByteToWideChar(CP_ACP, 0, gbk_str.c_str(), -1, nullptr, 0);if (wide_size == 0) {return "";}std::wstring wide_str(wide_size, L'\0');if (MultiByteToWideChar(CP_ACP, 0, gbk_str.c_str(), -1, wide_str.data(), wide_size) == 0) {return "";}// 宽字符到 UTF-8int utf8_size = WideCharToMultiByte(CP_UTF8, 0, wide_str.c_str(), -1, nullptr, 0, nullptr, nullptr);if (utf8_size == 0) {return "";}std::string utf8_str(utf8_size - 1, '\0');if (WideCharToMultiByte(CP_UTF8, 0, wide_str.c_str(), -1, utf8_str.data(), utf8_size, nullptr, nullptr) == 0) {return "";}return utf8_str;
}void set_GBK() {SetConsoleOutputCP(936); // 设置输出代码页为 GBKSetConsoleCP(936);      // 设置输入代码页为 GBK   
}void set_UTF8() {SetConsoleOutputCP(65001); // 设置输出代码页为 UTF8SetConsoleCP(65001);      // 设置输入代码页为 UTF8
}#define _STRING_FORMAT
#endif

这样就可以完美的使用啦

http://www.dtcms.com/a/342695.html

相关文章:

  • Java -- 互斥锁--死锁--释放锁
  • 机器学习两大核心算法:集成学习与 K-Means 聚类详解
  • 机器学习经典算法总结:K-Means聚类与集成学习(Bagging, Boosting, Stacking)
  • 机器学习核心算法笔记:集成学习与聚类算法
  • QT6(QSpinBox和QDoubleSpinBox)
  • java项目数据脱敏工具类实现
  • 【离线安装】CentOS Linux 7 上离线部署Oracle 19c(已成功安装2次)
  • 【数据可视化-96】使用 Pyecharts 绘制主题河流图(ThemeRiver):步骤与数据组织形式
  • 如何使用 DeepSeek 助力工作​
  • C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述-下篇)
  • 阿里云的centos8 服务器安装MySQL 8.0
  • 【LeetCode 415】—字符串相加算法详解
  • Java学习历程14——制作一款五子棋游戏(4)
  • R 语言科研配色 --- 第 85 期 (附免费下载的配色绘图PPT)
  • 全屋WiFi强电款WiFi6 86面板一站式测试解决方案
  • leetcode 904 水果成篮
  • 从零开始理解 K 均值聚类:原理、实现与应用
  • Grafana侧重可视化,那多数据源告警呢?
  • Linux的奇妙冒险——进程间通信(管道、SystemV IPC)
  • 【实战记录】麒麟服务器操作系统安装KSC-Defender安全中心全指南
  • EagleTrader交易员采访|交易是一场概率游戏
  • 免费DirectX修复工具?游戏运行异常?【图文详解】dll修复工具?D3DX9_43.dll丢失
  • 【科研绘图系列】R语言绘制序列分析图
  • Rust 的流程控制与函数
  • SQL 中 DISTINCT 的全方位指南:从基础用法到性能优化
  • 【51单片机】【protues仿真】基于51单片机温度烟雾控制系统
  • C++项目实战——高性能内存池(一)
  • Redis面试精讲 Day 26:Redis源码分析:事件循环与网络模型
  • docker使用和部署深化学习
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第一章知识点问答(21题)