天天看點

(轉)簡繁體轉換函數

    //---------------------------------------------------------------------------

    //函數輸入Big5字元,傳回Gb簡體字元

    //---------------------------------------------------------------------------

    AnsiString __fastcall Big2Gb(AnsiString sBig)

    {

     char* pszBig5=NULL; //Big5編碼的字元

     wchar_t* wszUnicode=NULL; //Unicode編碼的字元

     char* pszGbt=NULL; //Gb編碼的繁體字元

     char* pszGbs=NULL; //Gb編碼的簡體字元

     AnsiString sGb; //傳回的字元串

     int iLen=0; //需要轉換的字元數

     pszBig5=sBig.c_str(); //讀入需要轉換的字元參數

     //計算轉換的字元數

     iLen=MultiByteToWideChar (950, 0, pszBig5, -1, NULL,0) ;

     //給wszUnicode配置設定記憶體

     wszUnicode=new wchar_t[iLen+1];

     //轉換Big5碼到Unicode碼,使用了API函數MultiByteToWideChar

     MultiByteToWideChar (950, 0, pszBig5, -1, wszUnicode,iLen);

     //計算轉換的字元數

     iLen=WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ;

     //給pszGbt配置設定記憶體

     pszGbt=new char[iLen+1];

     //給pszGbs配置設定記憶體

     pszGbs=new char[iLen+1];

     //轉換Unicode碼到Gb碼繁體,使用API函數WideCharToMultiByte

     WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ;

     //轉換Gb碼繁體到Gb碼簡體,使用API函數LCMapString

     LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen);

     //傳回Gb碼簡體字元

     sGb=pszGbs;

     //釋放記憶體

     delete [] wszUnicode;

     delete [] pszGbt;

     delete [] pszGbs;

     return sGb;

    }

    //--------------------------------------------------------------------------- 

    //函數輸入Gb字元,傳回Big5字元 

    //--------------------------------------------------------------------------- 

    AnsiString __fastcall Gb2Big(AnsiString sGb) 

    { 

    char* pszGbt=NULL; //Gb編碼的繁體字元 

char* pszGbs=NULL; //Gb編碼的簡體字元 

    wchar_t* wszUnicode=NULL; //Unicode編碼的字元 

    char* pszBig5=NULL; //Big5編碼的字元 

    AnsiString sBig5; //傳回的字元串 

    int iLen=0; //需要轉換的字元數 

    pszGbs=sGb.c_str(); //讀入需要轉換的字元參數 

    //計算轉換的字元數 

    iLen=MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0) ; 

    //給pszGbt配置設定記憶體 

    pszGbt=new char[iLen*2+1]; 

    //轉換Gb碼簡體到Gb碼繁體,使用API函數LCMapString 

    LCMapString(0x0804,LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2); 

    //給wszUnicode配置設定記憶體 

    wszUnicode=new wchar_t[iLen+1]; 

    //轉換Gb碼到Unicode碼,使用了API函數MultiByteToWideChar 

    MultiByteToWideChar (936, 0, pszGbt, -1, wszUnicode,iLen); 

    //計算轉換的字元數 

    iLen=WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ; 

    //給pszBig5配置設定記憶體 

    pszBig5=new char[iLen+1]; 

    //轉換Unicode碼到Big5碼,使用API函數WideCharToMultiByte 

    WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, pszBig5,iLen, NULL, NULL) ; 

    //傳回Big5碼字元 

    sBig5=pszBig5; 

    //釋放記憶體 

    delete [] wszUnicode; 

    delete [] pszGbt; 

    delete [] pszBig5; 

    return sBig5; 

    } 

void 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; 

  } 

}

void 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; 

  } 

}

void 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; 

  } 

}

void 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; 

  } 

 // 調用示例.... 

  char sourceEncode[255]; 

  char szBuf[1024]; 

  // 從 GB2312 轉到 GBK 

  strcpy(szBuf, sourceEncode); 

  GB2GBK(szBuf); 

  // 從GB2312 轉到 BIG5,通過 GBK 中轉 

  strcpy(szBuf, sourceEncode); 

  GB2GBK(szBuf); 

  GBK2BIG5(szBuf); 

  ...... 

轉自:http://blog.csdn.net/kamplus/archive/2008/01/07/2029380.aspx

繼續閱讀