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; }