C - char与wchar_t(TCHAR/WCHAR)之间的相互转换

18 篇文章 0 订阅
17 篇文章 1 订阅

1、wchar_t类型数据的初始化

在程序中,wchar_t又经常被重新定义为 TCHAR类型 或 WCHAR类型。

char类型数据的初始化就不再骜述了;只说一下wchar_t类型的初始化:

wchar_t[] = L"我是wchar_t类型的数据";    //wchar_t类型数据初始化时前面需加上宏L

2、char与wchar_t之间的转换

    char与wchar_t类型数据之间的转换不能通过赋值的方式进行,只能通过 WideCharToMultiByteMultiByteToWideChar 两个系统函数进行,这两个系统函数都在<windows.h>中

2.1、wchar_t转char

char * wchar2char(const wchar_t* wchar )
{
    char * m_char;    
    int len= WideCharToMultiByte( CP_ACP ,0, wchar, wcslen(wchar), NULL,0, NULL ,NULL );    
    m_char= new char[len+1];     
    WideCharToMultiByte( CP_ACP, 0, wchar, wcslen(wchar), m_char, len, NULL ,NULL );     
    m_char[len]= '\0';     
    return m_char; 
}

 在上面的代码中,使用起来是比较方便的,但是由于在函数体内进行new的操作,所以可能会存在内存泄漏的情况,下面用一种比较安全的方式进行转换【修改于 20210528】:

推荐:

//转换函数
int Wchar2Char(char* charStr, const wchar_t* wcharStr){   
	int len= WideCharToMultiByte(CP_ACP ,0, wcharStr, wcslen(wcharStr), NULL,0, NULL ,NULL );    
	WideCharToMultiByte(CP_ACP ,0, wcharStr, wcslen(wcharStr), charStr, len, NULL ,NULL );     
	charStr[len]= '\0'; 
	return len; 
}

//调用方式1
void call1(const wchar_t* wcharStr){
    int id_len = wcslen(charStr) + 16;
	char* charStr= new char[id_len];
	Wchar2Char(charStr, w_charStr );	
	//use....
	delete []charStr;
}

//调用方式2
void call2(){
    char charStr[1024];		//For char
	wchar_t w_charStr[1024];		//For wchar_t
	Wchar2Char(charStr, w_charStr);	
}

2.2、char转wchar_t

wchar_t * char2wchar(const char* cchar) 
{     
    wchar_t *m_wchar;    
    int len = MultiByteToWideChar( CP_ACP, 0, cchar, strlen(cchar), NULL, 0);     
    m_wchar= new wchar_t[len+1];     
    MultiByteToWideChar( CP_ACP, 0, cchar, strlen( cchar), m_wchar, len);     
    m_wchar[len]= '\0' ;    
    return m_wchar; 
} 

 在上面的代码中,也是由于在函数体内进行new的操作,所以可能会存在内存泄漏的情况,下面用一种比较安全的方式进行转换【修改于 20210528】:

推荐:

int Char2Wchar(wchar_t* wcharStr, const char* charStr){
	int len = MultiByteToWideChar(CP_ACP, 0, charStr, strlen(charStr), NULL, 0);

	MultiByteToWideChar(CP_ACP, 0, charStr, strlen(charStr), wcharStr, len);     
	wcharStr[len]= '\0' ;    
	return len;
}

//调用方式1
void call1(const char* charStr){
    int id_len = strlen(charStr) + 16;
	wchar_t* w_charStr = new wchar_t[id_len];
	Wchar2Char(charStr, w_charStr );	
	//use....
	delete []w_charStr ;
}

//调用方式2
void call2(){
    char charStr[1024];		//For char
	wchar_t w_charStr[1024];		//For wchar_t
	Char2Wchar(w_charStr, charStr);	
}

 

  • 5
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值