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博客