vs2005下的编码转码

来源:互联网 发布:手机游戏网络稳定软件 编辑:程序博客网 时间:2024/04/27 13:44

        习惯了linux c的编程,由于有个项目开发环境是windows,接触到了vc,一下子就懵了,在用vs2005开发的过程中,遇到的一个比较头疼的问题就是utf8和windows默认编码gbk(ANSI)相互转化的问题。在查阅了n多资料后,终于找了一个比较容易实现的方式。

         首先因为涉及到嵌入系统问题,所以使用了MFC。由此包含的头文件是<cstringt.h><winnls.h><atlstr.h>

ConvertUTF8ToANSI(char* strUTF8,CString &strANSI) //    
{    
 int nLen = ::MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,(LPCTSTR)strUTF8,-1,NULL,0);  
//返回需要的unicode长度    
 WCHAR * wszANSI = new WCHAR[nLen+1];    
 memset(wszANSI, 0, nLen * 2 + 2);    
 nLen = MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8, -1, wszANSI, nLen);    //把utf8转成unicode   
 
 nLen = WideCharToMultiByte(CP_ACP, 0, wszANSI, -1, NULL, 0, NULL, NULL);        //得到要的ansi长度    
 char *szANSI=new char[nLen + 1];    
 memset(szANSI, 0, nLen + 1);    
 WideCharToMultiByte (CP_ACP, 0, wszANSI, -1, szANSI, nLen, NULL,NULL);          //把unicode转成ansi    
 strANSI = szANSI;    
 delete wszANSI;    
 delete szANSI;    
}

 

Ansi2UTF8(CString &text)
{
     // first convert ansi to unicode
     DWORD LenUni = MultiByteToWideChar(GetACP(),0,text,-1,NULL,0);
     wchar_t *uniStr = new wchar_t[LenUni];
     MultiByteToWideChar(CP_ACP,0,text,-1,uniStr,LenUni);
     
     // then convert unicode to UTF8
     DWORD LenUTF8 = WideCharToMultiByte(CP_UTF8,0,uniStr,-1,NULL,0,NULL,NULL);
     char *utf8Str = new char[LenUTF8];
     WideCharToMultiByte(CP_UTF8,0,uniStr,-1,utf8Str,LenUTF8,NULL,NULL);
     text = (LPCTSTR)utf8Str;
}

 

CString就相当于linux c里的const char*吧

CString可由string.c_str()来转化

string可由CString.GetBuffer(0)来转化

原创粉丝点击