Windows/MFC,C++中的TCHAR体系/char体系/WCHAR体系及其相互转换

34 篇文章 0 订阅
31 篇文章 1 订阅
</pre><pre>

Windows/MFC,C++编程中经常遇TCHAR, WCHAR, char字符串。

并经常要对这些字符串进行转换,

本文对这些体系与其转换进行了总结。

第一篇:基础篇


Windows编程总的3大体系:

TCHAR(根据环境转换为WCHAR或者char),

WCHAR(宽字符集使用UNICODE),

char(使用ACSII码)

3大体系常用函数及解析详见博文:http://blog.csdn.net/u010003835/article/details/47344775 


此外,接下来我书写的函数以Windows对char*,TCHAR*,const  TCHAR*等的命名规则来书写。

即LPSTR,LPWSTR。。。

不熟悉的童鞋可以参考博文: http://blog.csdn.net/u010003835/article/details/47604553




TCHAR类型,根据环境判断选择字符集 


所需要的字符串转换宏:

 _T()/ TEXT() 根据当前环境对字符串进行转换

其与L的区别见博文: http://blog.csdn.net/u010003835/article/details/47606621



 代表函数及其正确使用方法示例:

LPTSTR temp_t = new TCHAR[MAXN]; 

temp_t[0] = 0; 

_tcscpy(temp_t, _T("Hi, Kemeng~")); 

_tprintf(_T("_tprintf: %s\n"), temp_t); 

delete[] temp_t;


 






WCHAR类型,使用UNICODE编码


所需要的字符串转换宏:L"XXXX" ,将当前字符串编码为UNICODE格式


测试代码:

LPWSTR temp_w = new WCHAR[MAXN];

temp_w[0] = 0;

wcscpy(temp_w, L"Hi, Kemeng~");

wprintf(L"wprintf: %s\n", temp_w);

delete[] temp_w;


常见的错误:

第一种:

wprintf("%s", L"AAAAAA");


另一种:

wprintf(L"%s", "AAAAAA");



正确写法:

wprintf(L"%s", L"AAAAAA");



wcout 貌似更智能一些,会对原始字符串进行转换,估计通过重载,测试后在进行补充


ASCII编码,

不需要字符串转换宏

示例代码

	LPSTR temp_c = new char[MAXN];
	temp_c[0] = 0;
	strcpy(temp_c, "Hi, Kemeng~");
	printf("printf: %s\n", temp_c);
	delete[] temp_c;




第二章:进阶篇

WCHAR,TCHAR,char类型字符串之间的转换:

方法一:使用A2T等宏。

宏的名称含义请参见博文:

http://blog.csdn.net/u010003835/article/details/47609975

如果使用这些宏需要包含头文件:

#include <atlbase.h>

并且要声明

USES_CONVERSION;//T2A,A2T,W2T,W2A,A2CW等支持,需要进行此声明


完整的测试代码:

#include <iostream>
#include <windows.h>
#include <atlbase.h>
#include <tchar.h>
using namespace std;


#define MAXN 255

#pragma warning(disable:4996)

int main(){
	USES_CONVERSION;	//T2A,A2T,W2T,W2A,A2CW等支持,需要进行此声明

	//T2A. TCHAR字符串 到 char字符串的转换。
	cout << endl << "TCHAR Convertion to char use T2A" << endl;
	LPTSTR name1_t = _T("Hi, KeMeng~");			
	LPSTR temp1_c = NULL;
	temp1_c = T2A(name1_t);
	
	_tprintf(_T("%s\n"), name1_t);
	printf("%s\n",temp1_c);
	cout << "--------------------------" << endl;

	
	//A2T. char字符串 到 TCHAR字符串的转换
	cout << endl << "char Convertion to TCHAR use A2T" << endl;
	LPSTR name2_c = "Hi, KeMeng~";
	LPTSTR temp2_t = A2T(name2_c);
	printf("%s\n", name2_c);
	_tprintf(_T("%s\n"), temp2_t);
	cout << "--------------------------" << endl;

	
	//W2T. WCHAR字符串 到 TCHAR字符串的转换
	cout << endl << "WCHAR Convertion to TCHAR use W2T" << endl;
	LPWSTR name3_w = L"Hi, KeMeng~";
	LPTSTR temp3_t = T2W(name3_w);
	wprintf(L"%s\n", name3_w);
	_tprintf(_T("%s\n"), temp3_t);
	cout << "--------------------------" << endl;

	//W2T. WCHAR字符串 到 const char字符串的转换
	cout << endl << "WCHAR Convertion to const CHAR use W2CA" << endl;
	LPWSTR name4_w = L"Hi, KeMeng~";
	LPCSTR temp4_a = W2CA(name4_w);
	wprintf(L"%s\n", name4_w);
	printf("%s\n", temp4_a);
	cout << "--------------------------" << endl;


	return 0;
}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值