TCHAR、WCHAR、CHAR以及WideCharToMultiByte、MultiByteToWideChar

8 篇文章 0 订阅
2 篇文章 0 订阅

最近把一个之前在VC6.0下做的工程放到VS2008下修改,结果发现编译出错,查找相关资料后,发现主要是VS2008下默认的是 使用UNICODE字符集,而在VC6.0下默认的是使用多字节字符集,结果导致CString,TCHAR等都出现一些问题,于是又顺便恶补了一下字符集相关的知识。


关于几种字符类型:

CHAR:一个字符占8位,1个字节,可以表示中文,但是会有本地化问题,就比如有时候下到一个游戏,结果发现所有文字都是乱码,需要设置本机的区域选项才可以正常显示文字,就是因为这个问题导致的,如果使用WCHAR就不会有这个问题。

WCHAR:一个字符占16位,2个字节,可以表示中文,不会有本地化问题。使用这个可以不用担心目录是否是中文之类的。

TCHAR:这个根据开发环境的字符集选项不同而不同,在使用UNICODE字符集的时候,这个是WHCAR,而使用多字节字符集的时候,这个是CHAR。


不同字符间的转换:

	char sAnsi[20];
	memset(sAnsi, 0x00, 20);
	sprintf(sAnsi, "ANSI字符串");

	//
	//char TO wchar
	wchar_t *pwsUnicode = NULL;
	int nWChLen = MultiByteToWideChar(CP_ACP, 0, sAnsi, -1, NULL, 0);	//获取转换后的wchar长度 长度为8 7个字符+1个结束符
	pwsUnicode = new wchar_t[nWChLen];
	MultiByteToWideChar(CP_ACP, 0, sAnsi, -1, pwsUnicode, nWChLen);	//实际转换
	//使用完后删除
// 	delete[] pwsUnicode;
// 	pwsUnicode = NULL;

	//
	//wchar TO char
	char *psAnsi = NULL;
	int nChLen = WideCharToMultiByte(CP_ACP, 0, pwsUnicode, -1, NULL, 0, NULL, NULL);	//获取转换后的char长度 长度为11 10个字符(4+2*3)+1个结束符
	psAnsi = new char[nChLen];
	WideCharToMultiByte(CP_ACP, 0, pwsUnicode, -1, psAnsi, nChLen, NULL, NULL);
	//使用后删除
// 	delete[] psAnsi;
// 	psAnsi = NULL;

	delete[] pwsUnicode;
	pwsUnicode = NULL;
	delete[] psAnsi;
	psAnsi = NULL;

关于第一个参数CP_ACP

这个参数主要指的是CHAR的内容所在的字符集和WCHAR没有关系。


另外,这两个函数需要的头文件是 windows.h。


几个字符的宏:

_T("TCHAR") //根据字符集设置改变

L"WCHAR" //UNICODE字符



P.S:linux下:

这个函数在linux下有类似的函数iconv和mbstowcs、wcstombs,需要配合setlocale函数使用。如果转换函数转换失败,那么需要考虑你的linux系统是否有安装相应的字符集。如果你在setlocale时候就出错返回NULL了,那基本就是系统没有相应的字符集了,装字符集去吧。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值