首页 > 其他分享 >宽窄字节3:宽窄字节字符串的转换

宽窄字节3:宽窄字节字符串的转换

时间:2025-01-15 15:33:49浏览次数:3  
标签:转换 字节 char 宽窄 need 字符串 wchar NULL

文章目录


前言

宽窄字节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

相关文章

  • 宽窄字节4:CString的方便之处及优缺点
    文章目录前言一、CString类的方便之处二、使用方式1.CString类型的一些内置成员函数。2.CString对于TCHAR的封装3.CString类对于宽窄字节的转换4.CString类的优缺点总结前言宽窄字节4:CString的方便之处及优缺点。一、CString类的方便之处CString类归属于ATL,在MF......
  • 【C语言】_字符串函数strcpy
    目录1. 函数声明及功能2.使用示例3.注意事项4. 模拟实现4.1第一版:基本功能+判空+const修饰4.2第二版:优化对于'\0'的单独拷贝4.3第三版:仿strcpy的char*返回值1. 函数声明及功能char*strcpy(char*destination,constchar*source); strcpy功能:字......
  • 字符串匹配(BP&KMP算法)
    BP&KMP算法字符串匹配前言BP算法(基础)引文KMP算法(进阶)伪代码描述next数组递归求解思路算法思路详解KMP算法实现及测试(先做在看!)字符串匹配前言本文是基于懒猫老师的课程----BP&KMP所写,在观看本文之前最好配合视频或者PPT食用更佳,地址我附在下面:https://www.bilibi......
  • 【轻松掌握数据结构与算法】字符串算法(String Algorithms)
    字符串算法概述字符串匹配算法是计算机科学中的一个重要领域,主要用于在文本中查找特定模式(子字符串)的出现位置。这些算法在文本编辑器、搜索引擎、生物信息学等领域有广泛的应用。暴力法(BruteForceMethod)暴力法是最直接的字符串匹配算法,它通过逐个字符比较来查找模式在文......
  • 百度面试真题 - 大小端字节序问题(联合体/共用体 - 面试加分)
    标题大小端字节序标题大小端字节序(联合体/共用体)优质资源以上bilibili教程(大小端存储-详细简介)(空间也有)目录​编辑简介大小端存储(空间视频详解):强制类型转换- char*:巧用联合体,解决百度面试题 - 大小端字节序问题:使用联合体的优点:简介......
  • 案例分析:子词嵌入从字节编码以保护隐私的技术(SEB)的实际应用
    案例分析:子词嵌入从字节编码以保护隐私的技术(SEB)的实际应用简介:在本文中,我们将深入探讨一个创新且极具前景的技术领域,子词嵌入从字节编码(SubwordEmbeddingsfromByte-Coding,简称SEB)。此技术主要用于文本处理,尤其是在需要保护个人隐私的场合下,它提供了独特的解决方案以提升......
  • 344. 反转字符串
    题目这道题很简单了,自己写的:classSolution{public:voidreverseString(vector<char>&s){intn=s.size();for(inti=0;i<n/2;++i){chartmp;tmp=s[i];s[i]=s[n-1-i];......
  • 205. 同构字符串
    题目这道题一直想着用一个哈希表能不能做出来,最终没有做出来。看了卡哥思路,卡哥是用了两个哈希表,使用两个map保存s[i]到t[j]和t[j]到s[i]的映射关系,如果发现对应不上,立刻返回false。看了卡哥代码敲的:classSolution{public:boolisIsomorphic(strings,stri......
  • 1130: 【入门】简单a+b(字符串式子a+b)
    看到了吗,不是正常的输入a和b,然后直接相加,而是一个式子,没关系,一个字符串对于电脑而言奥秘多多,给电脑一个式子,他会反应吗?是不是不会。诶,但是让他去提取,那就是“怎么看都看不够”,嘿嘿,开个玩笑,就是提取字符串里的信息可以解决不少问题,这题就是这样。下面是代码:#include<bits/stdc......
  • #1407. 字符串的插入
    题目描述输入一个句子(一行),将句子中的每一个单词翻转后输出。输入格式只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。输出格式翻转每一个单词后的字符串,单词之间的空格需与原文一致。输入数据1helloworld输出数据1ollehdlrow代码:#include<iostr......