[win32]unicode与ansi互相转化

Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个/0结尾,常用于txt文本文件
Unicode字符串,每个字符(汉字、 英文字母)都占2个字节,以2个连续的/0结尾 

将当前的项目设置成unicode或是ansi的下面的代码都成立

#include "stdafx.h"
#include <Windows.h>
#include <clocale>
//使用的是多字节字符集,就在窄字符集,则TCHAR就是 char
//此函数在ANSI字符集的环境下,窄字节转换成宽字节
void AnsiToUnicode() 
{
	//ansi to unicode
	//方法一
	char szAnsi[]="abc123你我他-ansi";//ANSI多字节编码字符串strMultiByte 
	printf("窄字节strMultiByte: %s\n",szAnsi);//输出 abc123你我他
	int len =MultiByteToWideChar(CP_ACP,NULL,szAnsi,strlen(szAnsi),NULL,0);//预转换,得到所需空间的大小
	wchar_t* strWideChar=new wchar_t [len+1];分配空间要给'/0'留个空间,MultiByteToWideChar不会给'/0'空间
	MultiByteToWideChar(CP_ACP,NULL,szAnsi,strlen(szAnsi),strWideChar,len);//开始转换  
	strWideChar[len]='\0'; //最后加上'\0'
	MessageBoxW(NULL,strWideChar,strWideChar,0);
	//swprintf(temp);//输出 zerosou1 
	delete[] strWideChar;
	strWideChar=NULL;

	//方法二
	setlocale(LC_CTYPE,"chs");//设置当前地域信息,不设置的话,使用这种方法,中文不会正确显示;需要#include<locale.h>
	wchar_t wcsStr[100];
	swprintf(wcsStr,L"%S",szAnsi);//swprintf是sprintf的unicode版本;格式的前面要加大写L,代表是unicode;注意是大写S,在unicode中,代表后面是ansi字符串,不然小写的s的话会出现乱码
	MessageBoxW(NULL,wcsStr,wcsStr,0);
}
//使用的是Unicode的字符集,则TCHAR就是wchar_t
//此函数在Unicode的环境下,是宽字节转换成窄字节
void UnicodeToAnsi()
{
	//unicode to ansi
	//方法一
	wchar_t wszStr[]=L"abc123你我他-unicode";//Unicode宽字节编码字符串 
 	int len =WideCharToMultiByte(CP_ACP,NULL,wszStr,wcslen(wszStr),NULL,0,NULL,NULL);
 	char* szAnsi=new char[len+1];
 	WideCharToMultiByte(CP_ACP,NULL,wszStr,wcslen(wszStr),szAnsi,len,NULL,NULL);//开始转换  
	szAnsi[len]='\0'; 
	MessageBoxA(NULL,szAnsi,szAnsi,0);
	delete [] szAnsi;
	szAnsi=NULL;

	//方法二
	setlocale (LC_CTYPE, "chs");//若没有此行,则下面一行输出的就是  ??
	char szStr[100];
	sprintf(szStr,"%S",wszStr);//大写'S'在ansi中,代表后面是unic字符串
	MessageBoxA(NULL,szStr,szStr,0);
}
int _tmain(int argc, _TCHAR* argv[])
{
	AnsiToUnicode(); 
	UnicodeToAnsi();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值