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

news2024/9/20 22:50:03

系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、中文乱码原因
  • 二、解决方法
      • 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,setting
		std::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 privileges
	if (!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 finish
	WaitForSingleObject(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 command
	if (!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 command
	if (!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 stop
	while (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.coloradmin.cn/o/2056010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图像特效系列】图像毛玻璃特效的实践 | 包含代码和效果图

目录 一 毛玻璃特效 1 代码 2 效果图 图像特效系列主要是对输入的图像进行处理,生成指定特效效果的图片。图像素描特效会将图像的边界都凸显出来;图像怀旧特效是指图像经历岁月的昏暗效果;图像光照特效是指图像存在一个类似于灯光的光晕特效,图像像素值围绕光照中心点呈…

极光推送(JPush)携手中大英才,打造智慧教育新模式

随着互联网技术的快速发展&#xff0c;在线教育行业蓬勃兴起&#xff0c;用户对学习体验的要求也越来越高。作为国内领先的职业技能知识培训服务商&#xff0c;中大英才(北京)网络教育科技有限公司(简称“中大英才”)始终致力于为多层次求知学习人士提供专业化、智能化和科学化…

实战演练:通过API获取商品详情并展示

实战演练&#xff1a;通过API获取商品详情并展示&#xff0c;通常涉及以下几个步骤&#xff1a;确定API接口、发送HTTP请求、处理响应数据、以及将数据展示给用户。这里我们以一个假想的商品详情API为例&#xff0c;使用Python语言和requests库来完成这个任务。 步骤 1: 确定A…

DMHS数据同步工具

DMHS数据同步工具 ​ 本章节主要介绍DM数据同步工具DMHS的使用&#xff0c;通过将oracle11g的数据同步到DM8的过程来理解DMHS的功能和作用。 安装前的准备 端口、服务信息 IP地址服务名称版本端口安装路径192.168.19.136OracleOracle11.0.21521/opt/oracle/DMHS源端dmhs_V3…

第100+22步 ChatGPT学习:概率校准 Platt Scaling

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

MapBox Android版开发 1 配置

MapBox Android版开发 1 配置 前言MapBox V9 配置创建工程配置地图配置私钥配置公钥配置仓库配置依赖配置权限地图初始化 显示地图布局文件地图Activity 运行效果 MapBox V11 配置创建工程配置地图配置私钥配置公钥配置仓库配置依赖配置权限 显示地图布局文件 运行效果 前言 本…

ee trade:黄金投资与股票投资的区别

黄金和股票&#xff0c; 是金融市场中两种常见的投资工具&#xff0c; 它们拥有截然不同的特点和风险&#xff0c; 了解它们的差异&#xff0c; 可以帮助投资者制定更合理的投资策略。 一、 投资性质&#xff1a; 避险与成长&#xff0c; 两种投资方向 黄金&#xff1a; 被视…

金价徘徊高位,市场聚焦美联储降息预期

现货黄金高位震荡 周二亚市早盘&#xff0c;现货黄金在2500美元/盎司关口附近徘徊&#xff0c;交投于2503.23美元/盎司附近。金价周一在创纪录的高位后出现回调&#xff0c;投资者从涨势中获利了结&#xff0c;并根据美联储的线索调整仓位&#xff0c;现货黄金最终收报2504.1…

Vue - 详细介绍 vue-monoplasty-slide-verify vue3-puzzle-vcode 滑动验证组件

Vue - 详细介绍 vue-monoplasty-slide-verify & vue3-puzzle-vcode 滑动验证组件 在日常的账号登录所需要的大部分是滑动验证来检验人为操作&#xff0c;免于字母验证码的繁琐输入&#xff0c;下面介绍在Vue2和Vue3中适用的滑动验证组件。 1、vue-monoplasty-slide-verif…

【GitLab】使用 Docker 安装 3:gitlab-ce:17.3.0-ce.0 配置

参考阿里云的教程docker的重启 sudo systemctl daemon-reload sudo systemctl restart docker配置 –publish 8443:443 --publish 8084:80 --publish 22:22 sudo docker ps -a 當容器狀態為healthy時,說明GitLab容器已經正常啟動。 root@k8s-master-pfsrv:~

远离内卷,新的跨境电商蓝海,智能小家电沃尔玛1P新赛道——WAYLI威利跨境助力商家

随着全球经济格局的变迁&#xff0c;跨境电商已经成为新的蓝海领域&#xff0c;其中智能小家电市场更是呈现出蓬勃的发展态势。在这样的背景下&#xff0c;沃尔玛1P会员凭借其独特的优势&#xff0c;正开辟出一条全新的跨境电商赛道。 一、智能小家电市场崛起&#xff0c;源于消…

通义灵码代码搜索功能的前沿性研究论文被软件工程国际顶会 FSE 录用

在今年 FSE 2024 软件工程大会上&#xff0c;阿里云通义灵码团队和重庆大学合作的论文《An Empirical Study of Code Search in Intelligent Coding Assistant: Perceptions, Expectations, and Directions》被 FSE Industry 2024 (CCF A) 录用。 本篇论文主要探讨了在智能编码…

告别硬件!试试ToDesk云电脑,让你的云端体验更有趣

在这个不断进步的数字时代&#xff0c;科技的每一次突破都在重新塑造我们的生活和工作模式。随着云计算技术的不断成熟&#xff0c;传统的硬件限制正在逐渐消失&#xff0c;一个全新的云端时代正悄然兴起。ToDesk云电脑作为这场变革的领航者&#xff0c;正引领我们进入一个更加…

海绵城市雨水监测系统简介

海绵城市雨水监测系统主要有&#xff1a;数据采集、无线数据传输、后台云服务、终端平台显示等部分组成。系统通过前端数据采集水质&#xff08;ss\cod\浊度、PH等&#xff09;、雨水雨量、流量、水位、土壤湿度、气象等数据。通过无线数据传输通讯&#xff08;4G、5G、以太网、…

高性能web服务器详解

一、Web服务的基础介绍 正常情况下单次web服务访问的流程简图&#xff1a; 1.1 Web服务介绍 这里介绍的是 Apache 和 NGINX 1.1.1 Apache 经典的Web服务端 Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是 1.X 和 2.X…

Ubuntu 16.04 通过deb包安装内核头文件

文章目录 前言通过deb包安装内核头文件 前言 Ubuntu16.04部分内核版本无法通过 apt-get install linux-headers-$(uname -r) 来进行安装&#xff1a; # cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE16.04 DISTRIB_CODENAMExenial DISTRIB_DESCRIPTION"Ubuntu…

linux 部署YUM仓库及NFS共享服务

目录 简介 一、YUM仓库服务 1.1 YUM概述 1.2 linux系统各家厂家用的安装源 1.3 yum命令 1.4 yum下载方式 1.5 部署YUM软件仓库 二、NFS共享存储服务 2.1 NFS共享存储服务概念 2.2 NFS配置环境 2.3 使用NFS发布共享资源 2.4 在客户端访问NFS共享 简介 yum&#xff…

测试面试题集锦(五)| 自动化测试与性能测试篇(附答案)

简介 本系列文章总结归纳了一些软件测试工程师常见的面试题&#xff0c;主要来源于个人面试遇到的、网络搜集&#xff08;完善&#xff09;、工作日常讨论等&#xff0c;分为以下十个部分&#xff0c;供大家参考。如有错误的地方&#xff0c;欢迎指正。有更多的面试题或面试中遇…

Apeaksoft Video Converter Ultimate for Mac:强大的视频转换与编辑工具

Apeaksoft Video Converter Ultimate for Mac是一款专为Mac用户设计的视频转换与编辑软件&#xff0c;凭借其强大的功能和用户友好的界面&#xff0c;在视频处理领域脱颖而出。该软件不仅支持多种视频格式的转换&#xff0c;还内置了丰富的视频编辑功能&#xff0c;让用户能够轻…

海康VisionMaster使用学习笔记12-通信框架介绍

1. 通信的用途 用途: 通信是连通算法平台和外部设备的重要渠道&#xff0c;在算法平台中既支持外部数据的读入也支持数据的写出&#xff0c;当通信构建起来以后既可以把软件处理结果发送给外界&#xff0c;又可以通过外界发送字符来触发相机拍照或者软件运行。 2. 通信的种类…