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() );