c++_string和wstring的相互转换

string和wstring的区别

wstring是宽字符,占用2个字节的大小,针对UNICODE编码格式,用于对中文汉字的定义和赋值。wstring跟string区别为:字节不同、编码格式不同、使用不同。

一、字节不同
1、wstring:wstring是宽字符,占用2个字节的大小,即16bit。

2、string:string是窄字符,占用1个字节的大小,即8bit。

也就是说,宽字符,每表示一个字符其实是占了16bit,即2个char的大小。而汉字就是需要16bit来表示。

二、编码格式不同
1、wstring:wstring一般针对UNICODE编码格式,一个单元两个char。

2、string:string一般针对ASCII编码格式,一个单元一个char。

三、使用不同
1、wstring:在使用中文汉字时,使用wstring来定义变量进行赋值。

2、string:在使用英文汉字时,使用string来定义变量进行赋值。

string是常用类型,可以看作char[]。而wstring,使用的是wchar_t类型,这是宽字符,用于满足非ASCII字符的要求,例如Unicode编码,中文,日文,韩文什么的。对于wchar_t类型,实际C++中都用与char函数相对应的wchar_t的函数,因为他们都是从同一个模板类似于上面的方式定义的。因此也有wcout, wcin, werr等函数。实际上string也可以使用中文,但是它将一个汉字写在2个char中。而如果将一个汉字看作一个单位wchar_t的话,那么在wstring中就只占用一个单元,其它的非英文文字和编码也是如此。这样才真正的满足字符串操作的要求,尤其是国际化等工作。
 

注意要想使用标准C++中string类,必须要包含#include <string>

是<string>,而不是<string.h>,带.h的是C语言中的头文件

#include <iostream>
#include <string>

#include <Windows.h>

//将string转换成wstring  
std::wstring string2wstring(std::string str)
{
	std::wstring result;
	//获取缓冲区大小,并申请空间,缓冲区大小按字符计算  
	int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
	TCHAR* buffer = new TCHAR[len + 1];
	//多字节编码转换成宽字节编码  
	MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
	buffer[len] = '\0';             //添加字符串结尾  
	//删除缓冲区并返回值  
	result.append(buffer);
	delete[] buffer;
	return result;
}

//将wstring转换成string  
std::string wstring2string(std::wstring wstr)
{
	std::string result;
	//获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的  
	int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
	char* buffer = new char[len + 1];
	//宽字节编码转换成多字节编码  
	WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
	buffer[len] = '\0';
	//删除缓冲区并返回值  
	result.append(buffer);
	delete[] buffer;
	return result;
}

int main()
{
	//double f = 23.43;
	//std::wstring f_str = std::to_wstring(f);
	//std::wcout << f_str << std::endl;

	//std::wstring str = L"你好";
	//setlocale(LC_ALL, "chs");//设置wcout输出中文
	//std::wcout << str.c_str() << std::endl;

	setlocale(LC_ALL, "chs");//设置wcout输出中文

	std::string str1 = "深圳龙华qinghujiedao";
	std::cout << "print str:" << str1 << std::endl;
	std::wstring wstr = string2wstring(str1);
	std::wcout << "str2wstr convert:" << wstr << std::endl;

	std::wstring str2 = L"深圳龙华qinghujiedao";
	std::wcout << "print wstr:" << str2 << std::endl;
	std::string str = wstring2string(str2);
	std::cout << "wstr2str convert:" << str << std::endl;


	system("pause");
	return 0;
}

在显示wstring的过程中,发现wcout不能直接显示中文。需要进行本地化设置,调用函数setlocale()

其中,MultiByteToWideChar和WideCharToMultiByte函数的使用,需要包含#include <Windows.h>的头文件。

wstring和wchar_t*的相互转换

#include <iostream>
#include <Windows.h>
#include <string>

std::wstring wchart_arrayTowstring(wchar_t a[])
{
    std::wstring wstr = L"";
    int j = 0;
    while (a[j] != L'\0')
    {
        wstr += a[j];
        j++;
    }
    return wstr;
}


int main()
{
    setlocale(LC_ALL, "chs");

    //wstring转wchar_t*
    std::wstring w_str = L"深圳龙华qinghu";
    const wchar_t* w_chars = w_str.c_str();
    std::wcout << w_chars << std::endl;

    //wchar_t*转wstring
    wchar_t w_chars2[] = L"深圳红山hongshan";
    std::wstring w_str2 = wchart_arrayTowstring(w_chars2);
    std::wcout << w_str2 << std::endl;

    system("pause");
    return 0;
}

wstring转wchar_t*的两种方式:

wchar_t* w_chars = w_str.c_str();
或者
wchar_t* w_chars = &w_str[0];

参考博客:

https://it.cha138.com/ios/show-37368.html

wstring是什么?跟string有什么区别_wstring和string的区别_千百元的博客-CSDN博客

 string和wstring之间转换的三种方法_string转wstring_利白的博客-CSDN博客

C++ 字符串string、字符char、宽字符数组wstring、宽字符wchar_t互相转换(2021.4.20)_string转化成wchar_jing_zhong的博客-CSDN博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值