char与wchar_t
C++基本数据类型中表示字符的有两种:char、wchar_t。
char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为它表示一个字时可能是一个字节也可能是多个字节。
string与wstring
字符数组可以表示一个字符串,但它是一个定长的字符串,我们在使用之前必须知道这个数组的长度。为方便字符串的操作,STL定义好了字符串的类string和wstring。string肯定不陌生,但wstring可能就用的少了。
string是普通的多字节版本,是基于char的,对char数组进行的一种封装。
wstring是Unicode版本,是基于wchar_t的,对wchar_t数组进行的一种封装。
废话不多说,直接上代码:
编译运行环境:Windows 10, Visual Studio 2015 Enterprise
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
/*
string 转换为 wstring
*/
std::wstring c2w(const char *pc)
{
std::wstring val = L"";
if (nullptr == pc)
{
return val;
}
size_t i;
size_t size_of_ch = strlen(pc);
size_t size_of_wc = size_of_ch + 1;
wchar_t* pw = nullptr;
pw = new wchar_t[size_of_wc];
errno_t flag = mbstowcs_s(&i, pw, size_of_wc, pc, size_of_wc);
cout << "the lenght of converted:" << i << endl;
if (flag != 0)
{
cout << "convert failed." << endl;
return val;
}else {
val = pw;
delete[] pw;
return val;
}
}
/*
wstring 转换为 string
*/
std::string w2c(const wchar_t * pw)
{
std::string val = "";
if (!pw)
{
return val;
}
size_t convert;
size_t size_of_ch = wcslen(pw) + 1;
char *pc = nullptr;
if (!(pc = (char*)malloc(size_of_ch)))
{
return val;
}
errno_t flag = wcstombs_s(&convert, pc, size_of_ch, pw, size_of_ch);
/*转换成功时,返回值为0。失败,返回其他值 errno_t错误类型*/
if (flag != 0)
{
return val;
}else {
val = pc;
free(pc);
return val;
}
}
int main()
{
const char* src = "Hello World";
wstring dst = c2w(src);
wcout << dst << endl;
return 0;
}