GBK和UTF-8互相轉碼


<1>.GBK ---> UTF-8

void ConvertGBKToUtf8(CString& strGBK) 
{
    int len = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL, 0);
    WCHAR *wszUtf8 = new WCHAR[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;
}

<2>.UTF-8 ---> GBK

void ConvertUtf8ToGBK(CString& strUtf8) 
{
    int len = MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL, 0);
    WCHAR *wszGBK = new WCHAR[len+1];
    memset(wszGBK, 0, len*2+2);
    MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

    len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
    char *szGBK = new char[len+1];
    memset(seGBK, 0, len+1);
    WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);

    strUtf8 = szGBK;
    delete[] szGBK;
    delete[] wszGBK;
}

------------------------------------------------------------------------------------------------

ps:

[1].MultiByteToWideChar
函數功能:該函數映射一個字符串到一個寬字符(unicode)的字符串。
函數原型:

int MultiByteToWideChar( 
  UINT CodePage, 
  DWORD dwFlags, 
  LPCSTR lpMultiByteStr, 
  int cchMultiByte, 
  LPWSTR lpWideCharStr, 
  int cchWideChar 
  );

函數參數:
CodePage:指定執行轉換的字符集,這個參數可以為系統已安裝或有效的任何字符集所給定的值。
CP_ACP:ANSI字符集;CP_MACCP:Macintosh代碼頁;CP_OEMCP:OEM代碼頁;
CP_SYMBOL:符號字符集(42);CP_THREAD_ACP:當前線程ANSI代碼頁;
CP_UTF7:使用UTF-7轉換;CP_UTF8:使用UTF-8轉換。
dwFlags:一組未標記用以指出是否未轉換成預作或寬字符(若組合形式存在),是否使用象形文字替代控制字符,以及如何處理無效字符。
lpMultiByteStr:指向將被轉換字符串的字符。
cchMultiByte:指定由參數lpMultiByteStr指向的字符串中字節的個數。如果lpMultiByteStr指定的字符串以空字符終止,可以設置為-1(如果字符串不是以空字 符中止,設置為-1可能失敗,可能成功),此參數設置為0函數將失敗。
lpWideCharStr:指向接收被轉換字符串的緩沖區。
cchWideChar:指定由參數lpWideCharStr指向的緩沖區的字節數。若此值為零,函數返回緩沖區所必需的寬字符數,在這種情況下,lpWideCharStr中的緩沖區不被 使用。


[2].WideCharToMultiByte
函數功能:該函數映射一個unicode字符串到一個多字節字符串。
函數原型:

int WideCharToMultiByte( 
  UINT CodePage,          //指定執行轉換的代碼頁 
  DWORD dwFlags, 
  LPCWSTR lpWideCharStr, //指定的寬字節字符串的緩沖區 
  int cchWideChar,       //指定由參數lpWideCharStr指向的緩沖區的字符個數 
  LPSTR lpMultiByteStr,  //指向接收被轉換字符串的緩沖區 
  int cchMultiByte,      //指定由參數lpMultiByteStr指向的緩沖區最大值 
  LPCSTR lpDefaultChar, 
  LPBOOL pfUsedDefaultChar 
  ); 

*注意*:以上兩個函數參數指針lpMultiByteStr和lpWideCharStr必須不一樣,否則函數返回失敗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM