std::wcout,std::cout控制台输出中文乱码,std::cerr字符串的字符无效

系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、中文乱码原因
  • 二、解决方法
      • 1.如果是windos11下,使用英文语言,需要加以下代码
      • 2.如果是中文语言只需要一行关键代码
      • 3.如果在异常处理中显示宽字符中文
      • 4.完整代码如下:
      • 实现文件
      • 测试代码
      • 输出打印

前言

我们在win32编程中使用宽字符,std::wstring经常会遇到中文乱码的情况,比方说在调试时,查看std::string类型的字符串是显示字符串的字符无效,其实这时候已经中文乱码了,还有就是在控制台输出时也会出现中文乱码。
在这里插入图片描述
在这里插入图片描述

一、中文乱码原因

1.编码不匹配:
宽字符编码与输出流编码不匹配:std::wstring 存储的是宽字符(wchar_t),通常使用 UTF-16 或者其他宽字符编码(如 UCS-2)。当你尝试将 std::wstring 输出到 std::cout 或 std::cerr 时,这些流默认使用的是 char 类型,因此需要将宽字符转换为相应的 char 类型编码(例如 UTF-8 或 GBK)。
控制台编码设置不正确:Windows 控制台默认使用的是 CP850 或 CP437 编码。如果你的程序输出的是 UTF-8 或者其他编码的字符串,那么在默认编码下可能会导致乱码。

2.输出流设置不正确:
如果你使用 std::wcout 或 std::wcerr 输出宽字符串,那么你需要确保你的控制台支持宽字符输出,并且设置了正确的编码。
如果你使用 std::cout 或 std::cerr 输出宽字符串,你需要先将宽字符串转换为对应的窄字符串(std::string),并确保转换编码正确。

二、解决方法

1.如果是windos11下,使用英文语言,需要加以下代码

system("chcp 936");
std::wcout.imbue(std::locale("chs"));

2.如果是中文语言只需要一行关键代码

std::wcout.imbue(std::locale("chs"));

3.如果在异常处理中显示宽字符中文

std::string utf8ToGbk(const std::string& utf8Str)
{int size_needed = MultiByteToWideChar(CP_UTF8, 0, &utf8Str[0], (int)utf8Str.size(), NULL, 0);std::wstring wstrTo(size_needed, 0);MultiByteToWideChar(CP_UTF8, 0, &utf8Str[0], (int)utf8Str.size(), &wstrTo[0], size_needed);int size_needed_gbk = WideCharToMultiByte(CP_ACP, 0, &wstrTo[0], -1, NULL, 0, NULL, NULL);std::string strTo(size_needed_gbk, 0);WideCharToMultiByte(CP_ACP, 0, &wstrTo[0], -1, &strTo[0], size_needed_gbk, NULL, NULL);return strTo;
}
int main()
{try {system("chcp 936");std::wcout.imbue(std::locale("chs"));std::wcout << "控制台输出中文" << std::endl;//setConsoleEncodingUTF8(); // 设置控制台编码为 UTF-8// 创建 ServicesControl 实例//ServicesControl svcCtrl(L"Delivery Optimization");auto svcCtrl = std::make_shared<WindowsServiceControl::ServicesControl>(L"Delivery Optimization");// 检查是否已具有管理员权限if (svcCtrl->isAdmin()) {std::cout << "Running with administrator permissions.\n";// 启动服务svcCtrl->startService(L"Delivery Optimization");std::cout << "Service started successfully.\n";// 停止服务svcCtrl->stopService(L"Delivery Optimization");std::cout << "Service stopped successfully.\n";}else {// 如果没有管理员权限,尝试提升权限svcCtrl->elevatePermissionsAndRun();}}catch (const std::runtime_error& e) {std::string str(e.what());std::string gbkStr = utf8ToGbk(str);std::cerr << "An error occurred: " << str << std::endl;return 1;}return 0;
}

4.完整代码如下:

头文件:

#pragma once#include <windows.h>
#include <iostream>
#include <string>namespace WindowsServiceControl {class IServicesControl {public:virtual bool isAdmin() = 0;virtual bool elevatePermissionsAndRun() = 0;virtual bool startService(const std::wstring& serviceName) = 0;virtual bool stopService(const std::wstring& serviceName) = 0;};
}#pragma once
#include "IServicesControl.h"using namespace WindowsServiceControl;namespace WindowsServiceControl {class ServicesControl : public IServicesControl {public:explicit ServicesControl(const std::wstring& serviceName);bool isAdmin() override;bool elevatePermissionsAndRun() override;bool startService(const std::wstring& serviceName) override;bool stopService(const std::wstring& serviceName) override;//getting,settingstd::wstring getServiceName() { return _errorMessage; }void setServiceName(std::wstring& serviceName) { _serviceName = serviceName; }private:std::wstring _serviceName;std::wstring _errorMessage;private:std::wstring formatErrorMessage();std::string wstringToUtf8String(const std::wstring& wstr);void throwRuntimeErrorWithWstring(const std::wstring& wstr);};
}

实现文件

#include "ServicesControl.h"
#include <tchar.h>
#include <vector>
#include <stdexcept>
#include <sstream>ServicesControl::ServicesControl(const std::wstring& serviceName) : _serviceName(serviceName)
{}bool ServicesControl::isAdmin()
{HANDLE hToken = nullptr;if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {DWORD lastError = GetLastError();formatErrorMessage();throw std::runtime_error("Failed to open process token. Error code: " + std::to_string(lastError));}TOKEN_ELEVATION elevation;DWORD cbSize = sizeof(TOKEN_ELEVATION);if (!GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &cbSize)) {CloseHandle(hToken);DWORD lastError = GetLastError();formatErrorMessage();throw std::runtime_error("Failed to get token information. Error code: " + std::to_string(lastError));}CloseHandle(hToken);if (elevation.TokenIsElevated == 0) {formatErrorMessage();throw std::runtime_error("The process is not running with administrator permissions.");}return true;
}bool ServicesControl::elevatePermissionsAndRun()
{STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));TCHAR szCmdLine[MAX_PATH];_sntprintf_s(szCmdLine, MAX_PATH, _T("%s"), GetCommandLine());TCHAR szAppPath[MAX_PATH];GetModuleFileName(nullptr, szAppPath, MAX_PATH);// Attempt to launch the application with elevated privilegesif (!CreateProcessAsUser(nullptr, szAppPath, szCmdLine, nullptr, nullptr, FALSE,CREATE_NEW_CONSOLE | CREATE_NO_WINDOW | EXTENDED_STARTUPINFO_PRESENT,nullptr, nullptr, &si, &pi)) {DWORD lastError = GetLastError();formatErrorMessage();throw std::runtime_error("Failed to create process with elevated privileges. Error code: " + std::to_string(lastError));}// Wait for the process to finishWaitForSingleObject(pi.hProcess, INFINITE);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return true;
}bool ServicesControl::startService(const std::wstring& serviceName)
{SC_HANDLE hSCManager = OpenSCManager(nullptr, nullptr, SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE);if (hSCManager == nullptr) {DWORD lastError = GetLastError();formatErrorMessage();throw std::runtime_error("OpenSCManager failed. Error code: " + std::to_string(lastError));}SC_HANDLE hService = OpenService(hSCManager, serviceName.c_str(), SERVICE_START | SERVICE_QUERY_STATUS);if (hService == nullptr) {CloseServiceHandle(hSCManager);DWORD lastError = GetLastError();formatErrorMessage();throw std::runtime_error("OpenService failed. Error code: " + std::to_string(lastError));}// Send start commandif (!StartService(hService, 0, nullptr)) {CloseServiceHandle(hService);CloseServiceHandle(hSCManager);DWORD lastError = GetLastError();formatErrorMessage();throw std::runtime_error("StartService failed. Error code: " + std::to_string(lastError));}CloseServiceHandle(hService);CloseServiceHandle(hSCManager);return true;
}bool ServicesControl::stopService(const std::wstring& serviceName)
{SC_HANDLE hSCManager = OpenSCManager(nullptr, nullptr, SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE);if (hSCManager == nullptr) {DWORD lastError = GetLastError();throw std::runtime_error("OpenSCManager failed. Error code: " + std::to_string(lastError));}SC_HANDLE hService = OpenService(hSCManager, serviceName.c_str(), SERVICE_STOP | SERVICE_QUERY_STATUS);if (hService == nullptr) {CloseServiceHandle(hSCManager);DWORD lastError = GetLastError();formatErrorMessage();throw std::runtime_error("OpenService failed. Error code: " + std::to_string(lastError));}SERVICE_STATUS_PROCESS ssStatus;DWORD dwBytesNeeded;// Send stop commandif (!ControlService(hService, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssStatus)) {CloseServiceHandle(hService);CloseServiceHandle(hSCManager);DWORD lastError = GetLastError();formatErrorMessage();throw std::runtime_error("ControlService failed. Error code: " + std::to_string(lastError));}// Wait for the service to stopwhile (QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssStatus, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded)) {if (ssStatus.dwCurrentState == SERVICE_STOPPED)break;Sleep(ssStatus.dwWaitHint);}CloseServiceHandle(hService);CloseServiceHandle(hSCManager);return true;
}// Helper function to convert wide string to UTF-8 string
std::string ServicesControl::wstringToUtf8String(const std::wstring& wstr)
{if (wstr.empty()) return std::string();int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);std::string strTo(size_needed, '\0');WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);return strTo;
}void ServicesControl::throwRuntimeErrorWithWstring(const std::wstring& wstr) {std::string utf8Str = wstringToUtf8String(wstr);throw std::runtime_error(utf8Str);
}std::wstring ServicesControl::formatErrorMessage()
{std::wstring errorMessage;wchar_t buffer[1024] = L"";DWORD lastError = GetLastError();FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,nullptr, lastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),buffer, 1024, nullptr);errorMessage = L"OpenService failed. Error code: " + std::to_wstring(lastError) + L". " + buffer;//std::string utf8Str = wideToUtf8(errorMessage);std::wcout << errorMessage << std::endl;throw std::runtime_error(wstringToUtf8String(errorMessage));//throw std::runtime_error(errorMessage);
}

测试代码

#include "ServicesControl.h" // 包含 ServicesControl 类的定义
#include <memory>
#include <io.h>
#include <fcntl.h>using namespace WindowsServiceControl;std::string utf8ToGbk(const std::string& utf8Str)
{int size_needed = MultiByteToWideChar(CP_UTF8, 0, &utf8Str[0], (int)utf8Str.size(), NULL, 0);std::wstring wstrTo(size_needed, 0);MultiByteToWideChar(CP_UTF8, 0, &utf8Str[0], (int)utf8Str.size(), &wstrTo[0], size_needed);int size_needed_gbk = WideCharToMultiByte(CP_ACP, 0, &wstrTo[0], -1, NULL, 0, NULL, NULL);std::string strTo(size_needed_gbk, 0);WideCharToMultiByte(CP_ACP, 0, &wstrTo[0], -1, &strTo[0], size_needed_gbk, NULL, NULL);return strTo;
}int main()
{try {system("chcp 936");std::wcout.imbue(std::locale("chs"));std::wcout << "控制台输出中文" << std::endl;//setConsoleEncodingUTF8(); // 设置控制台编码为 UTF-8// 创建 ServicesControl 实例//ServicesControl svcCtrl(L"Delivery Optimization");auto svcCtrl = std::make_shared<WindowsServiceControl::ServicesControl>(L"Delivery Optimization");// 检查是否已具有管理员权限if (svcCtrl->isAdmin()) {std::cout << "Running with administrator permissions.\n";// 启动服务svcCtrl->startService(L"Delivery Optimization");std::cout << "Service started successfully.\n";// 停止服务svcCtrl->stopService(L"Delivery Optimization");std::cout << "Service stopped successfully.\n";}else {// 如果没有管理员权限,尝试提升权限svcCtrl->elevatePermissionsAndRun();}}catch (const std::runtime_error& e) {std::string str(e.what());std::string gbkStr = utf8ToGbk(str);std::cerr << "An error occurred: " << str << std::endl;return 1;}return 0;
}

输出打印

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405622.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java异常捕获与处理:深入理解与实践

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

SAM 2——视频和图像实时实例分割的全新开源模型

引言 源码地址&#xff1a;https://github.com/facebookresearch/segment-anything-2 过去几年&#xff0c;人工智能领域在文本处理的基础人工智能方面取得了显著进步&#xff0c;这些进步改变了从客户服务到法律分析等各个行业。然而&#xff0c;在图像处理方面&#xff0c;我…

高考志愿智能推荐系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

数据采集监控平台内置SPC系统 提供统计控制功能

数据采集监控平台为了能多方位的为工作人员提供可视化界面&#xff0c;而不仅仅是采集显示这种单一功能&#xff0c;内置多种配置&#xff0c;而SPC系统就是提供统计控制功能的一个重要系统。 数据采集监控平台内置的统计过程控制&#xff08;Statistical Process Control, SPC…

Python3 运算符,数据类型,基本方法,学习

注意&#xff1a;部分代码直接复制菜鸟教程&#xff0c;在本地编辑器里运行 运算符 算术运算符 #!/usr/bin/python3a 21 b 10 c 0c a b print ("1 - c 的值为&#xff1a;", c)c a - b print ("2 - c 的值为&#xff1a;", c)c a * b print (&quo…

【电子数据取证】AES解密侵犯隐私案件数据

关键词&#xff1a;电子数据取证、手机取证、计算机取证 一、前言 在大数据时代&#xff0c;数据安全和隐私保护的重要性愈发显著。近期&#xff0c;我们遇到一起侵犯公民隐私的案件&#xff0c;其复杂性与敏感性要求我们采取更为精细和专业的技术手段。在还原涉案数据库至本地…

【JAVA入门】Day24 - 排序算法

【JAVA入门】Day24 - 排序算法 文章目录 【JAVA入门】Day24 - 排序算法一、冒泡排序二、选择排序三、插入排序四、快速排序4.1 递归4.2 快速排序 排序&#xff0c;是把混乱的数据排成从小到大或从大到小。 排序一共有十种左右&#xff0c;它们是&#xff1a;冒泡排序、…

Ciallo~(∠・ω・ )⌒☆第二十二篇 入门request请求库使用

请求库是用于发送HTTP请求的工具。常见的请求库有requests&#xff0c;它是一个功能强大且易于使用的HTTP库。 使用requests库发送GET请求&#xff1a; import requests url "https://httpbin.org/get"# 携带get请求参数 params {"pn": 10,"size&q…

Android大脑--systemserver进程

用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 本文摘要 系统native进程的文章就先告一段落了&#xff0c;从这篇文章开始写Java层的文章&#xff0c;本文同样延续自述的方式来介绍systemserver进程&#xff0c;通过本文您将…

8个我平时每天都会看的网站,涵盖办公、娱乐、学习等

分享8个我平时每天都会看的网站&#xff0c;涵盖办公、娱乐、学习等多种类别&#xff0c;试过就知道有多好用&#xff01; 1、MyFreeMP3 tools.liumingye.cn/music/#/ 一个可以免费听歌的平台&#xff0c;不用充会员&#xff0c;里面收录了大多数的国内外知名流行歌手、乐队的…

电脑开机LOGO修改教程_BIOS启动图片替换方法

准备工具&#xff1a;刷BIOS神器和change logo&#xff0c;打包下载地址&#xff1a;https://download.csdn.net/download/baiseled/89374686 一.打开刷BIOS神器&#xff0c;点击备份BIOS&#xff0c;保存到桌面 二.打开change logo&#xff0c;1.点击load image&#xff0c;选…

Linux云计算 |【第二阶段】SECURITY-DAY1

主要内容&#xff1a; 监控基础&#xff08;系统监控命令、监控软件&#xff09;、Zabbix监控服务端部署、Zabbix监控客户端部署、创建监控主机、调用监控模板、自定义key、创建模板、应用集、监控项、绑定模板&#xff1b; 一、监控概述 1&#xff09;监控的目的 ① 实时报…

LED电子看板优化生产线的管理

在当今竞争激烈的制造业领域&#xff0c;企业不断寻求提高生产效率、降低成本和提升产品质量的方法。而 LED 电子看板作为一种先进的管理工具&#xff0c;正逐渐成为优化生产线管理的关键利器。 一、LED电子看板能够清晰地展示生产进度信息 在繁忙的生产线上&#xff0c;工人和…

18105 银行的叫号顺序

### 详细分析 为了模拟银行的叫号过程&#xff0c;我们可以使用优先队列&#xff08;堆&#xff09;来管理客户的服务顺序。优先级越高的客户会先得到服务&#xff0c;同级别的客户按到达时间先后顺序得到服务。如果优先级和到达时间都相同&#xff0c;则按输入顺序服务。 ##…

表达式求值 - 整形提升和截断

文章目录 一、整形提升二、为什么要整形提升&#xff1f;三、截断四、示例1&#xff0c;23① c1 c2② c3 c1 c2 4 一、整形提升 C语言的整形算数运算总是至少以缺省整形类型的精度来进行的。 为了获得这个精度&#xff0c;表达式中的字符类型和短整型操作数在使用之前被转换…

深度学习基础之前馈神经网络

目录 基本结构和工作原理 神经元和权重 激活函数 深度前馈网络 应用场景 优缺点 深度前馈神经网络与卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;的具体区别和联系是什么&#xff1f; 具体区别 联系 如何有效解决前馈神经网络…

爬虫案例4——爬取房天下数据

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正 任务&#xff1a;从房天下网中爬取小区名称、地址、价格和联系电话 目标网页地址&#xff1a;https://newhouse.fang.com/house/s/ 一、思路和过程 目标网页具体内容如下&#xff1a; ​​​​ …

成为Python砖家(3): 何时产生字节码 .pyc 文件

好奇&#xff1a;.pyc和 __pycache__是啥&#xff1f; 你是否好奇&#xff0c;在某些 Python 工程中&#xff0c;当执行了 xxx.py脚本后&#xff0c;多出了 __pycache__目录&#xff1f;这个目录下存放的是一些 .pyc结尾的文件。 这些文件&#xff0c;叫做 python bytecode。 …

深度剖析数字媒体产业链的无限潜力与创新生态

在当今信息爆炸的时代&#xff0c;数字媒体产业链正以势不可挡的姿态展现出其令人瞩目的无限潜力与创新生态。 数字媒体的发展潜力简直无可限量。从在线视频的爆发式增长&#xff0c;到虚拟现实和增强现实技术带来的沉浸式体验&#xff0c;再到社交媒体平台上丰富多彩的内容创…

Windows 应用程序加密 - 功能强大、可定制、开源且完全免费

先进而优雅的 Windows 应用程序加密 - 功能强大、可定制、开源且完全免费&#xff01; 项目地址&#xff1a;FadCrypt GitHub 工作原理&#xff1a; 1. 密码创建&#xff1a;设置密码后&#xff0c;密码会与锁定应用程序的配置文件一起加密保存。监控期间&#xff0c;这些文…