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