VC 实现 汉字 GBK(GB2312) 转化为 UTF8 编码

来源:互联网 发布:网络猫是什么 编辑:程序博客网 时间:2024/05/29 05:53

void ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}  

 

 

 

 

常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持。网上也有很多中文内码的转换工具,什么专家,大师,巨匠之类所有光辉灿烂的名字都被使用了,但是在自己的程序中集成这些功能岂不是更好。以前曾广泛流传过使用码表来转换中文内码的Code,但毕竟不完美,而且还要携带或内置一个巨大的表,浪费资源。Windows中提供了MultiByteToWideChar和WideCharToMultiByte两兄弟函数,足可以搞定这些功能了。    
   
    以下四个函数分别实现:  
   
    大五码转GBK码/GBK转大五码  
   
    GB2312码转GBK码/GBK码转GB2312码  
   
    于是有人要问了,为什么没有GB2312转BIG5和BIG5转GB2312呢,我们有GBK,可以做一下中转啊。可以将GB2312转成GBK,再将GBK转成BIG5,反之亦然。如果你嫌麻烦,可以自己写一个GB2BIG5/BIG52GB。  
   
  //---------------------------------------------------------------------------  
  //   大五码转GBK码:  
  //   い地チ㎝瓣   -->   中華人民共和國  
  void   __fastcall   BIG52GBK(char   *szBuf)  
  {  
   if(!strcmp(szBuf,   ""))  
    return;  
   int   nStrLen   =   strlen(szBuf);  
   wchar_t   *pws   =   new   wchar_t[nStrLen   +   1];  
   try  
   {  
    int   nReturn   =   MultiByteToWideChar(950,   0,   szBuf,   nStrLen,   pws,   nStrLen   +   1);  
    BOOL   bValue   =   false;  
    nReturn   =   WideCharToMultiByte(936,   0,   pws,   nReturn,   szBuf,   nStrLen   +   1,   "?",   &bValue);  
    szBuf[nReturn]   =   0;  
   }  
   __finally  
   {  
    delete[]   pws;  
   }  
  }  
  //---------------------------------------------------------------------------  
  //   GBK转大五码  
  //   中華人民共和國   -->   い地チ㎝瓣  
  void   __fastcall   GBK2BIG5(char   *szBuf)  
  {  
   if(!strcmp(szBuf,   ""))  
    return   ;  
   int   nStrLen   =   strlen(szBuf);  
   wchar_t   *pws   =   new   wchar_t[nStrLen   +   1];  
   try  
   {  
    MultiByteToWideChar(936,   0,   szBuf,   nStrLen,   pws,   nStrLen   +   1);  
    BOOL   bValue   =   false;  
    WideCharToMultiByte(950,   0,   pws,   nStrLen,   szBuf,   nStrLen   +   1,   "?",   &bValue);  
    szBuf[nStrLen]   =   0;  
   }  
   __finally  
   {  
    delete[]   pws;  
   }  
  }  
  //----------------------------------------------------------------------------  
  //   GB2312码转GBK码  
  //   中华人民共和国   -->   中華人民共和國  
  void   __fastcall   GB2GBK(char   *szBuf)  
  {  
   if(!strcmp(szBuf,   ""))  
    return;  
   int   nStrLen   =   strlen(szBuf);  
   WORD   wLCID   =   MAKELCID(MAKELANGID(LANG_CHINESE,   SUBLANG_CHINESE_SIMPLIFIED),   SORT_CHINESE_PRC);  
   int   nReturn   =   LCMapString(wLCID,   LCMAP_TRADITIONAL_CHINESE,   szBuf,   nStrLen,   NULL,   0);  
   if(!nReturn)  
    return;  
   char   *pcBuf   =   new   char[nReturn   +   1];  
   try  
   {  
    wLCID   =   MAKELCID(MAKELANGID(LANG_CHINESE,   SUBLANG_CHINESE_SIMPLIFIED),   SORT_CHINESE_PRC);  
    LCMapString(wLCID,   LCMAP_TRADITIONAL_CHINESE,   szBuf,   nReturn,   pcBuf,   nReturn   +   1);  
    strncpy(szBuf,   pcBuf,   nReturn);  
   }  
   __finally  
   {  
    delete[]   pcBuf;  
   }  
  }  
  //---------------------------------------------------------------------------  
  //   GBK码转GB2312码  
  //   中華人民共和國   -->   中华人民共和国  
  void   __fastcall   GBK2GB(char   *szBuf)  
  {  
   if(!strcmp(szBuf,   ""))  
    return;  
   int   nStrLen   =   strlen(szBuf);  
   WORD   wLCID   =   MAKELCID(MAKELANGID(LANG_CHINESE,   SUBLANG_CHINESE_SIMPLIFIED),   SORT_CHINESE_BIG5);  
   int   nReturn   =   LCMapString(wLCID,   LCMAP_SIMPLIFIED_CHINESE,   szBuf,   nStrLen,   NULL,   0);  
   if(!nReturn)  
    return;  
   char   *pcBuf   =   new   char[nReturn   +   1];  
   try  
   {  
    wLCID   =   MAKELCID(MAKELANGID(LANG_CHINESE,   SUBLANG_CHINESE_SIMPLIFIED),   SORT_CHINESE_BIG5);  
    LCMapString(wLCID,   LCMAP_SIMPLIFIED_CHINESE,   szBuf,   nReturn,   pcBuf,   nReturn   +   1);  
    strncpy(szBuf,   pcBuf,   nReturn);  
   }  
   __finally  
   {  
    delete   []pcBuf;  
   }  
  }  
  //---------------------------------------------------------------------------  
  //   测试代码  
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
   char   szBuf[255];  
   //   从GB2312转到GBK  
   strcpy(szBuf,   Edit1->Text.c_str());  
   GB2GBK(szBuf);  
   Edit2->Text   =   String(szBuf);  
   //   从GB2312转到BIG5,通过GBK中转  
   strcpy(szBuf,   Edit1->Text.c_str());  
   GB2GBK(szBuf);  
   GBK2BIG5(szBuf);  
   Edit3->Text   =   String(szBuf);  
  }    
   
    注意,请不要使用String类的c_str()作为上述几个函数的传入参数。