文章目录
前言
宽窄字节3:宽窄字节字符串的转换。
一、为什么要进行转换?
并不是程序中所有的字符串都用Unicode宽字节来表示,如网络发送的字符串就可以用窄字节,当对方收到之后默认收到的就是窄字节的,但是因为对方的程序可能用宽字节Unicode来编写界面,所以显示的时候就需要将窄字节转换为Unicode宽字节的字符串。这就涉及到了宽窄字节的转换。
二、使用微软提供的API函数实现宽窄字节转换
WideCharToMultiByte(); //宽字节转换为窄字节
MultiByteToWideChar(); //窄字节转换为宽字节
窄字节转换为宽字节的参数如下:
例子及具体注释如下:
wchar_t* cctry_a2w(char* p_a)
{
// 第一个参数为代码页,一般指向窄字节的(窄字节的代码页是可变的,宽字节是不可变的);第二个参数为一个Flag,默认为0;第三个参数为窄字节;第四个参数为窄字节字符串占用多少字节,传递0函数失败,传递-1即可包含字符串结尾的\0(当然也可以自己求);第五个参数为宽字节目标空间;第六个参数为目标空间的字符数大小
int need_w_char = MultiByteToWideChar(CP_ACP, 0, p_a, -1, NULL, 0); // 先调用一下得到宽字节需要多大空间(字符数)
if (need_w_char <= 0)
{
return NULL;
}
wchar_t* p_w = new wchar_t[need_w_char]; // 存储结果的宽字节
wmemset(p_w, 0, need_w_char); // 将p_w数组初始化为空,只有一个\0
MultiByteToWideChar(CP_ACP, 0, p_a, -1, p_w, need_w_char); // 进行宽字节转换
return p_w;
}
在主函数中进行调用即可
int main()
{
// 窄字节
char* p_a = (char*)"1234";
int a_len = strlen(p_a); // 窄字节字符串长度
wchar_t* p_www = cctry_a2w( p_a); // 调用封装的函数将窄字节转换为宽字节
//cout << a_len << endl ;
// 宽字节
wchar_t* p_wstr = (wchar_t*)L"hello";
int b_len = wcslen(p_wstr); // 宽字节字符串长度
//cout << b_len << endl;
// 通用类型
TCHAR* p_tstr = (TCHAR*)_T("hello");
int c_len = _tcslen(p_tstr); // 通用类型字符串长度
//cout << c_len << endl;
//字符串的拷贝
wchar_t sz_a[6] = { 0 };
wcscpy_s(sz_a, 6, p_wstr);
/sizeof函数
//cout << "p_a字节数"<<sizeof(p_a) << endl; //指针字节数
//cout << "p_a字符串字节数" << (strlen(p_a) + 1)* sizeof(char) << endl; // 长度+1是因为字符串结尾有一个\0
//cout << "p_wstr字符串字节数" << (wcslen(p_wstr) + 1) * sizeof(wchar_t) << endl; // 长度+1是因为字符串结尾有一个\0
//cout << "p_tstr字符串字节数" << (_tcslen(p_tstr) + 1) * sizeof(TCHAR) << endl; // 长度+1是因为字符串结尾有一个\0
}
可以看到转换成功
下面进行宽字节转换为窄字节的实现
char* cctry_w2a(wchar_t* p_w)
{
int need_a_char = WideCharToMultiByte(CP_ACP, 0, p_w, -1, NULL, 0, NULL, NULL); // 先调用一下得到窄字节需要多大空间(字符数),这里多了两个参数,不需要默认写NULL即可
if (need_a_char <= 0)
{
return NULL;
}
char* p_a = new char[need_a_char];
memset(p_a, 0, need_a_char);
WideCharToMultiByte(CP_ACP, 0, p_w, -1, p_a, need_a_char, NULL, NULL);
return p_a;
}
进行函数调用
wchar_t* p_wstr = (wchar_t*)L"hello";
int b_len = wcslen(p_wstr); // 宽字节字符串长度
char* p_aaa = cctry_w2a(p_wstr);
得到如下结果,转换成功
还有一点上面使用new新建数组,因此就需要进行delete操作
delete[] p_www;
delete[] p_aaa;
三、使用ATL提供的CA2W、CW2A、CT2W、CT2A来更方便地转换
上述微软提供的API函数用起来比较麻烦,下面介绍另一种方法:利用ATL提供的一些类定义实现转换
首先要使用这些类定义,需要加上头文件:#include <atlstr.h>
窄字节转换为宽字节
CA2W a2wObj(p_a); // 定义一个类CA2W对象实例,并初始化
wchar_t* p_ww = (wchar_t*)a2wObj; // 进行强制类型转换
转换成功
宽字节转换为窄字节
CW2A w2aObj(p_wstr);
char* p_aa = (char*)w2aObj;
转换成功
通用类型转换为宽字节和窄字节,主要用在不知道当前是宽字节还是窄字节的时候。
CT2A t2aObj(p_tstr);
char* p_ta = (char*)t2aObj;
CT2W t2wObj(p_tstr);
wchar_t* p_tw = (wchar_t*)t2wObj;
其实右键CT2A转到定义可以看到,在目前Unicode宽字节的项目中,CT2A直接调用的就是CW2A,CT2W同理
总结
宽窄字节3:宽窄字节字符串的转换。
标签:转换,字节,char,宽窄,need,字符串,wchar,NULL From: https://blog.csdn.net/qq_59940419/article/details/145105525