MFC中Unicode与ASCII码转换
Unicode码与ASCII码
Unicode码:Unicode码也是一种国际标准编码,采用二个字节编码,与ASCII码不兼容。它前128个字符就是ASCII码,之后是扩展码。
ASCII码:American Standard Code for Information Interchange,美国信息交换标准代码。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
MFC中工程中的设置字符集
Mfc工程中字符集的设置
在mfc工程属性->配置属性中->常规中->项目默认值->字符集中,有使用Unicode字符集的设置。
该字符集设置为Unicode字符集后,常用的CString的初始化,格式化接口,需要用到_T宏。此外,在char型数组转化为CString中,常常有乱码出现。下面总结一下,出现乱码后的解决方法。
当字符集设置成”使用多字节字符集”时,
将CString转化成char型数据指针:
CString file;
char* pFile = (LPSTR)(LPCSTR)file;
将char型数据转化为CString,不需要添加_T宏:
CString info;
char version[20];
info.AppendFormat("ldmp Sn: [%s] ..", version);
当字符集设置成”使用Unicode字符集”时,
CString与char型数据相互转化如下:
void CStringToChar(CString str,char *dst)
{
#ifdef _UNICODE
wchar_t *wChar = str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
// 将得到的wchar* 类型转为 char*类型
size_t len = wcslen(wChar) + 1;
size_t converted = 0;
char *cChar;
cChar = (char*)malloc(len * sizeof(char));
wcstombs_s(&converted, cChar, len, wChar, _TRUNCATE);
strcpy(dst,cChar);
free(cChar);
#else
CString cstr(str);
char *p = (LPSTR)(LPCSTR)str1;
// 第二种
使用 GetBuffer方法返回 char * 类型
CString str1 = "123";
char *t1 = str1.GetBuffer(str1.GetLength());
str1.ReleaseBuffer();
#endif
}
将char转化为CString方法:
- 直接使用格式化字符串。
CString info;
char version[20];
info.AppendFormat(_T("ldmp Sn: [%s] .."), version);
2.使用以下方法也可以转化
CString charToCString(char* str)
{
//将char 转换为 CString字符
#ifdef _UNICODE
DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if (!pwText)
{
return _T("");
}
MultiByteToWideChar(CP_ACP, 0, str, -1, pwText, dwNum);
CString cstr = pwText;
delete[](char *)pwText;
#else
CString cstr(str);
#endif
return cstr;
}
附:
GB2312,BIG5,Unicode编码转换方法
//GB2312 转换成 Unicode:
wchar_t* GB2312ToUnicode(const char* szGBString)
{
UINT nCodePage = 936; //GB2312
int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
wchar_t* pBuffer = new wchar_t[nLength+1];
MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
pBuffer[nLength]=0;
return pBuffer;
}
//BIG5 转换成 Unicode:
wchar_t* BIG5ToUnicode(const char* szBIG5String)
{
UINT nCodePage = 950; //BIG5
int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);
wchar_t* pBuffer = new wchar_t[nLength+1];
MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);
pBuffer[nLength]=0;
return pBuffer;
}
//Unicode 转换成 GB2312:
char* UnicodeToGB2312(const wchar_t* szUnicodeString)
{
UINT nCodePage = 936; //GB2312
int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
char* pBuffer=new char[nLength+1];
WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
pBuffer[nLength]=0;
return pBuffer;
}
//Unicode 转换成 BIG5:
char* UnicodeToBIG5(const wchar_t* szUnicodeString)
{
UINT nCodePage = 950; //BIG5
int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
char* pBuffer=new char[nLength+1];
WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
pBuffer[nLength]=0;
return pBuffer;
}
//繁体中文BIG5 转换成 简体中文 GB2312
char* BIG5ToGB2312(const char* szBIG5String)
{
LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);
wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);
char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);
int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);
char* pBuffer = new char[nLength + 1];
LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);
pBuffer[nLength] = 0;
delete[] szUnicodeBuff;
delete[] szGB2312Buff;
return pBuffer;
}
//简体中文 GB2312 转换成 繁体中文BIG5
char* GB2312ToBIG5(const char* szGBString)
{
LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);
int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);
char* pBuffer=new char[nLength+1];
LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);
pBuffer[nLength]=0;
wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);
char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);
delete[] pBuffer;
delete[] pUnicodeBuff;
return pBIG5Buff;
}