string和wstring相互转换以及wstring显示中文问题

article/2025/10/15 9:19:56

如果你只是使用C++来处理字符串,会用到string。不过string是窄字符串ASCII,而很多Windows API函数用的是宽字符Unicode。这样让string难以应对。作为中国的程序员,我们第一个想到的字符串就是中文,而不是英文。所以经常会遇到中文字符问题,需要经常在ASCII字符串和Unicode字符串转换。而C++的string并么有很好的去支持这么一个转换,所以还需要我们自己去写代码转换。
    而这个过程就是比较痛苦的。我遇到了我写一遍,你遇到了又写一遍,所以,大家总会感觉C++程序难,这里就是一个方面。STL提供的字符串类string不完善,所以让人很难受。所以,现在我写好了,就分享出来,供大家直接使用。
    以下是程序运行的效果:

而在写这个函数的过程中,意外发现wcout不能直接显示中文,真是够坑的。我们需要进行本地化设置,调用函数setlocale(),就可以了。在稍后给出的测试代码中有,就不单独写出来了。当然,如果你不想使用这个函数,也没有关系,你可以将wstring转为string,就可以正常输出中文了。
    下面先给出string转到wstring和wstring转string的函数代码,含头文件:

 

#include <comdef.h>
string wstring2string(wstring wstr)
{string result;int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);if( len <= 0 )return result;char* buffer = new char[len + 1];if(buffer == NULL )return result;WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);buffer[len] = '\0';result.append(buffer);delete[] buffer;return result;
}
wstring string2wstring(string str)
{wstring result;int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);if( len < 0 )return result;wchar_t* buffer = new wchar_t[len + 1];if( buffer == NULL )return result;MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);buffer[len] = '\0';result.append(buffer);delete[] buffer;return result;
}


    函数名称就可以看出函数的功能了。此转换利用了Windows的字符集转换函数WideCharToMultiByte和MultiByteToWideChar。不过可以感觉到,看到这两个函数那么多参数,心里还是蛮凉快的,哈哈哈。没关系,这里已经写好了代码,很欣慰吧。两个函数使用特别简单,一个输入一个输出。
    下面就是完整的测试代码:

#include <iostream>
using namespace std;
#include <comdef.h>
string wstring2string(wstring wstr)
{string result;int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);if( len <= 0 )return result;char* buffer = new char[len + 1];if(buffer == NULL )return result;WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);buffer[len] = '\0';result.append(buffer);delete[] buffer;return result;
}
wstring string2wstring(string str)
{wstring result;int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);if( len < 0 )return result;wchar_t* buffer = new wchar_t[len + 1];if( buffer == NULL )return result;MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);buffer[len] = '\0';result.append(buffer);delete[] buffer;return result;
}
void main()
{//stringstring str="string:C++技术网www.cjjjs.com";cout<<str.c_str()<<endl;//wstringwstring wstr = L"wstring:C++技术网www.cjjjs.com";setlocale( LC_ALL, "chs" );//设置wcout输出中文wcout<<wstr.c_str()<<endl;//将wstring转为string来显示中文cout<<"wstr2str:"<<wstring2string(wstr).c_str()<<endl;//将string转为wstringwstring wstr2 = string2wstring(str);wcout<<"str2wstr:"<<wstr.c_str()<<endl;int i;cin>>i;
}

本文转载自:string系列:6 string和wstring相互转换以及wstring显示中文问题


http://chatgpt.dhexx.cn/article/rplbXVM5.shtml

相关文章

C++里面,什么时候使用std::wstring

看你要使用什么字符编码了&#xff0c; std::wstring主要用于 UTF-16编码的字符,而std::string主要用于存储单字节的字符( ASCII字符集 )&#xff0c;但是也可以用来保存UTF-8编码的字符。&#xff08;UTF-8和UTF-16是UNICODE字符集的两种不同的字符编码&#xff09; 如果你的…

String类与wstring类的区别

String类与wstring类的区别 本质区别 存储字符的区别 #include <iostream> #include <string> using namespace std; int main() { wstring wstr1 L"你好世界"; // L普通字符串 宽字符串 const wchar_t *ch1 wstr1.c_str(); // 转化为宽字符…

从新建工程开始使用C++开发单片机(以STM32为例):七、移植Arduino的WString(附代码)

在上一篇文章中&#xff0c;介绍了outputString和inputString&#xff0c;其中所运用到的字符串类型String也是C驱动层中功能强大且重要的一个类。这个类移植自Arduino的WString。这篇文章将会展示WString的易用性&#xff0c;并且从编译输出后程序大小的角度比较WSting和C std…

0005:Qt常用类 - QDateTime

Qt常用类 - QDateTime 1 开发环境 在介绍内容之前&#xff0c;先说明一下开发环境&#xff0c;如下图&#xff1a; Qt版本&#xff1a;Qt5.3.2&#xff1b; Qt开发工具&#xff1a;Qt Creater 3.2.1&#xff1b; Qt构建工具&#xff1a;Desktop Qt 5.3 MinGW 32bit&#xff…

QDateTime的11种显示方式

QDateTime datetime QDateTime::currentDateTime(); datetime.toString(“hh:mm:ss\nyyyy/MM/dd”); datetime.toString(“hh:mm:ss ap\nyyyy/MM/dd”); datetime.toString(“hh:mm:ss\nyyyy-MM-dd”); datetime.toString(“hh:mm:ss ap\nyyyy-MM-dd”); datetime.to…

70 QDateTime时间戳转换有误

1 前言 在开发工具中需要用时间戳转换成格式化时间来显示&#xff0c;但引用QT中自带的时间类QDateTime转换时&#xff0c;发现转换时间有误问题&#xff0c;转换的结果时分秒是正确的&#xff0c;但月份确实错误的。因此在未深入研究qt实现情况下&#xff0c;需要得到正确的格…

QDateTime类的部分函数使用解析

QDateTime类提供了日期和时间功能。 QDateTime对象包含一个日历日期和一个时钟时间&#xff08;一个“日期时间”&#xff09;。它是QDate和QTime两个类的组合。它可以从系统时钟中读取当前日期时间。它提供比较日期时间和操作日期时间的函数&#xff0c;比如加上一定数量的秒…

QDateTime时间相减

qDebug()<<"span"<<QDateTime::fromMSecsSinceEpoch(QDateTime::currentDateTime().toMSecsSinceEpoch() - time.toMSecsSinceEpoch()).toUTC().toString("hh:mm:ss"); 1、使用 QDateTime::toMSecsSinceEpoch 计算时间差&#xff1b; 2、使用…

小心 QDateTime

QDateTime 时间跳变问题接收服务端时间问题 时间跳变问题 QDateTime的具体用法可以在Qt creator 鼠标双击选中&#xff0c;按 F1 查看它的文档, Qt 的文档还是不错的. 我们有时会用下面的代码来做等待, 在笔者使用过程中发现 //等待QDateTime n QDateTime::currentDateTime(…

QDateTime

一、描述 QDateTime 对象对日历日期和时钟时间进行编码。它结合了 QDate 和 QTime 类的特性。它可以从系统时钟中读取当前日期时间。它提供了用于比较日期时间和通过添加秒数、天数、月数或年数来操作日期时间的函数。 二、成员函数 1、QString toString(const QString &…

QDateTime、QTime获取当前时间

1、引用头文件 #include #include 2、显示当前时间 ui->label->setText(“QDateTime:\nCurrent Time is:” QDateTime::currentDateTime().toString(“yyyy-MM-dd hh:mm:ss ddd”)); ui->label->setText(ui->label->text() "\n\nQTime:\nHour mi…

通过图像修复的视觉提示

Visual Prompting via Image Inpainting 目录 总结 一、Introduction 二、Visual Prompting via Image Inpainting 1. Inpainting using MAE-VQGAN 2. Prompting Inpainting Models 3. The Computer Vision Figures Dataset 三、Experiments and Results 四、Discussio…

图像修复必读的10篇论文

点击上方“AI公园”&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶” 因公众号更改了推送规则&#xff0c;记得读完点“在看”~下次AI公园的新文章就能及时出现在您的订阅列表中 作者&#xff1a;Chu-Tak Li 编译&#xff1a;ronghuaiyang 导读 这10篇文章给出了图…

【图像修复】论文阅读笔记 ----- 《Image inpainting based on deep learning: A review》

文章目录 原文下载地址概述**单阶段修复****单结果修复****多元修复方法** **渐进图像修复**低分辨率图像修复高分辨率图像修复 基于先验知识的修复轮廓边缘引导图像修复生成性先验引导图像修复 用于图像修复的数据集**不规则掩模数据集&#xff1a;****图像修复数据集&#xf…

毕业设计之 - 基于深度学的图像修复 图像补全

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天向大家介绍 基于深度学的图像修复 图像补全 大家可用于 毕业设计 2 什么是图像内容填充修复 内容识别填充(译注: Content-aware fill ,是 photoshop 的一个功能)是一个强大的工具&#xff0c;设计师…

基于GAN的图像修复--论文笔记

文献下载看下载处或评论链接 /1 Region Normalization for Image Inpainting 主要内容&#xff1a;将损坏的图像输入到神经网络中可能会产生问题&#xff0c;例如无效像素的卷积、归一化的均值和方差。但是&#xff0c;当前方法无法解决网络中的均值和方差漂移问题。当前方…

图像修复文章汇总

图像修复技术的研究是计算机视觉以及计算机图形学的一个具有重大意义的研究课题。对于带有损失区域的图像&#xff0c;由于我们并不知道原本图像的具体形式&#xff0c;我们只能类似于“凭空捏造”一些像素去填补这种缺失。正因如此&#xff0c;图像修复实际是根据人类自己的视…

图像算法原理与实践——图像修复之 全变分模型

在图像算法的高层次处理中&#xff0c;有一类很典型的应用&#xff0c;就是图像修复算法。图像在采集、传输、预处理过程中&#xff0c;都可能会发生图像数据被修改、损失和缺失等问题&#xff08;例如&#xff1a;部分图像内容被污染、雾霾等&#xff09;&#xff0c;另外&…

图像修复序列——BSCB模型

1. 参考文献 2. BSCB模型代码 2.1 BSCB模型demo % demo_BSCB.m % Author: HSW % Date: 2015/3/25 % HARBIN INSTITUTE OF TECHNOLOGY % % set matlab close all; clear all; clc;options.null 0; % read image Img imread(Image\butterfly.bmp); Img imread(Image\peppers…

day29:图像修复

在实际应用 中&#xff0c; 图像常常会受到噪声的干扰&#xff0c;例如拍照时镜头上存在灰尘或者飞行的小动物。这些 干 扰会导 拍摄到的图像出现部分内容被遮挡 的情况.对于较为久远的图像&#xff0c;可能只有实体图像而没有数字存储形式的底板&#xff0c; 因此相片在保存和…