天天看點

VS GBK編碼和UTF-8編碼轉換

#include <Windows.h>

// 注釋:多位元組包括GBK和UTF-8

int GBK2UTF8(char *szGbk,char *szUtf8,int Len)

{

    // 先将多位元組GBK(CP_ACP或ANSI)轉換成寬字元UTF-16

    // 得到轉換後,所需要的記憶體字元數

    int n = MultiByteToWideChar(CP_ACP,0,szGbk,-1,NULL,0);

    // 字元數乘以 sizeof(WCHAR) 得到位元組數

    WCHAR *str1 = new WCHAR[sizeof(WCHAR) * n];

    // 轉換

    MultiByteToWideChar(CP_ACP,  // MultiByte的代碼頁Code Page

        0,            //附加标志,與音标有關

        szGbk,        // 輸入的GBK字元串

        -1,           // 輸入字元串長度,-1表示由函數内部計算

        str1,         // 輸出

        n             // 輸出所需配置設定的記憶體

        );

    // 再将寬字元(UTF-16)轉換多位元組(UTF-8)

    n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);

    if (n > Len)

    {

        delete[]str1;

        return -1;

    }

    WideCharToMultiByte(CP_UTF8, 0, str1, -1, szUtf8, n, NULL, NULL);

    delete[]str1;

    str1 = NULL;

    return 0;

}

//UTF-8 GBK

int UTF82GBK(char *szUtf8,char *szGbk,int Len)

    int n = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, 0);

    WCHAR * wszGBK = new WCHAR[sizeof(WCHAR) * n];

    memset(wszGBK, 0, sizeof(WCHAR) * n);

    MultiByteToWideChar(CP_UTF8, 0,szUtf8,-1, wszGBK, n);

    n = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);

        delete[]wszGBK;

    WideCharToMultiByte(CP_ACP,0, wszGBK, -1, szGbk, n, NULL, NULL);

    delete[]wszGBK;

    wszGBK = NULL;

    本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1880698,如需轉載請自行聯系原作者