vc中的字符转换
(之前的项目中遇到字符转换的问题,就是从txt文档中读取的文本需要转化为unicode码,MultiByteToWideChar和WideCharToMultiByte实现多字节编码和宽字符之间的相互转换,现总结如下MultiByteToWideChar实现多字节字符到宽字符的转换,
代码整理如下
char* pMultiByte = "多字节字符到宽字符的转换";
CString cstrWideChar; CodeSwitchForMTW(pMultiByte, cstrWideChar);其中函数为CodeSwitchForMTW为
void CodeSwitchForMTW(char* pMultiByte, CString& cstrWideChar)
{ int charLen = strlen(pMultiByte); // 计算char*数组大小,以字节为单位,一个汉字占两个字节int len = MultiByteToWideChar(CP_ACP,0,pMultiByte,charLen,NULL,0); // 计算多字节字符的大小,按字符计算
WCHAR *buf = new WCHAR[len + 1]; // 为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
MultiByteToWideChar(CP_ACP,0,pMultiByte,charLen,buf,len); // 多字节编码转换成宽字节编码
buf[len] = '\0'; // 添加字符串结尾,注意不是len+1
cstrWideChar.Append(buf); // 将TCHAR数组转换为CString
delete []buf;//删除缓冲区
}
WideCharToMultiByte实现宽字符向多字节字符的转换,
代码如下(由于不方便整理成函数,就直接列代码了)
// 宽字符向多字节字符的转换
CString cstrWideChar1 = _T("宽字符向多字节字符的转换"); int cstrlen = cstrWideChar1.GetLength(); // 注意:以下cstrlen和len的值大小不同,cstrlen是按字符计算的,len是按字节计算的 int len = WideCharToMultiByte(CP_ACP,0,cstrWideChar1,cstrlen,NULL,0,NULL,NULL); // 获取宽字节字符的大小,大小是按字节计算的 char * pMultiByte1 = new char[len+1]; //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小,以字节为单位 WideCharToMultiByte(CP_ACP,0,cstrWideChar1,cstrlen,pMultiByte1,len,NULL,NULL); // 宽字节编码转换成多字节编码 pMultiByte1[len] = '\0'; //多字节字符以'\0'结束delete[] pMultiByte1;
对于希望转换到不同的编码,就要用不同的编码号,除了CP_ACP,还有CP_UTF8等,可以查MSDN找到。
除了上面的方法可以实现转换外,还可以用A2T、A2W和T2A、W2A实现转换,如
使用函数:T2A、W2A
CString str = _T("D:\\校内项目\\QQ.bmp");
//声明标识符
USES_CONVERSION;//调用函数,T2A和W2A均支持ATL和MFC中的字符转换
char * pFileName = T2A(str); //char * pFileName = W2A(str); //也可实现转换注意:有时候可能还需要添加引用#include <afxpriv.h>
使用函数:A2T、A2W
char * pFileName = "D:\\校内项目\\QQ.bmp";
USES_CONVERSION;
CString s = A2T(pFileName);或CString s = A2W(pFileName);
使用这些函数时USES_CONVERSION;只要使用一次就可以了,虽然使用简单,但如果想实现到不同编码的实现,如UTF8等,就可能力不从心了。
另外,还可以使用_T宏,将常字符串转换为宽字符,如AfxMessageBox(_T("加载数据失败"),0);,这个应该都是知道的。
参考:
另外看到有网友用函数实现的,参考
摘录如下
wstring MultCHarToWideChar(string str)
{
//获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的
int len=MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),NULL,0);
TCHAR *buffer=new TCHAR[len+1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),buffer,len);
buffer[len]='\0';//添加字符串结尾
//删除缓冲区并返回值
wstring return_value;
return_value.append(buffer);
delete []buffer;
return return_value;
}
string WideCharToMultiChar(wstring str)
{
string return_value;
//获取缓冲区的大小,并申请空间,缓冲区大小是按字节计算的
int len=WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),NULL,0,NULL,NULL);
char *buffer=new char[len+1];
WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),buffer,len,NULL,NULL);
buffer[len]='\0';
//删除缓冲区并返回值
return_value.append(buffer);
delete []buffer;
return return_value;
}
于是使用
string mstring = WideCharToMultiChar( (LPCTSTR)mCString );
strcpy_s( pach, sizeof(pach), mstring.c_str() );