1. 程式人生 > >VC++ UTF-8與GBK格式轉換

VC++ UTF-8與GBK格式轉換

宣告:本人一個菜鳥,網上搜羅了很多關於VC++程式設計的資料,可每本資料都是涵蓋面太廣,難以細緻。英語又太爛,所以不得意只得摸索,恐又忘記所以記在此處,若有不對的地方,煩勞指出,不勝感激。

author:[email protected]

license:GPL

IDE:Visual Studio 2008


UTF-8和GBK同屬於多位元組MultiByte,轉換思路是先將多位元組的UTF-8或GBK轉換成寬字元(UTF-16),然後再將寬字元轉換成多位元組的GBK或UTF-8。

// 註釋:多位元組包括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);
    if (n > Len)
    {
        delete[]wszGBK;
        return -1;
    }

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

    delete[]wszGBK;
    wszGBK = NULL;

    return 0;
}