UTF-8 和 CString 互相转换

    有时候获取web服务器返回的数据,显示出来中文是乱码的形式。这个时候就会用到下面这两个函数来转换。


char* CreateUTF8TextInitWithString(CString strValue)  
{  
    char *buffer = NULL;  
    int  length;  
  
#ifdef _UNICODE  
    length = WideCharToMultiByte(CP_UTF8, 0, strValue, -1, NULL, 0, NULL, NULL);  
#else  
    return NULL;  
#endif  
    if (length <= 0)  
    {  
        return NULL;  
    }  
  
    buffer = new char[length];  
    if (buffer == NULL)  
    {  
        return NULL;  
    }  
  
    ZeroMemory(buffer, length);  
  
#ifdef _UNICODE  
    WideCharToMultiByte(CP_UTF8, 0, strValue, -1, buffer, length, NULL, NULL);  
#else  
    strcpy_s(buffer, length, strValue);  
#endif  
  
    return buffer;  
}  
  
  
BOOL CreateString_InitWithUTF8Text(CString& str, char* pUTF8Text)  
{  
    if (NULL == pUTF8Text)  
    {  
        return FALSE;  
    }  
  
    int  unicodeLen = ::MultiByteToWideChar( CP_UTF8,  
        0,  
        pUTF8Text,  
        -1,  
        NULL,  
        0 );   
  
    wchar_t*  pUnicode = new  wchar_t[unicodeLen+1];  
    if (NULL == pUnicode)  
    {  
        return FALSE;  
    }  
  
    MultiByteToWideChar( CP_UTF8, 0, pUTF8Text, -1, (LPWSTR)pUnicode, unicodeLen );  
  
    str = pUnicode;  
  
    delete []pUnicode;  
    return TRUE;  
}


int _tmain()  
{  
    // 转换 CString 到 utf-8编码  
    char* buff = CreateUTF8TextInitWithString(CString(TEXT("这都不是问题吧。")));   
  
    // 转换 utf-8 到 CString 编码  
    CString str;  
    if (CreateString_InitWithUTF8Text(str, buff))  
    {  
        cout << "successed... ";  
    }  
  
    delete []buff;  
    return 0;  
}  


#include <string>
using std::string;

string GBKToUTF8(const std::string& strGBK)
{
        string strOutUTF8 = "";
        int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
        WCHAR* str1 = new WCHAR[n];
        ZeroMemory(str1, n*sizeof(WCHAR));
        MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
        n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
        char *str2 = new char[n];
        ZeroMemory(str2, n);
        WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
        strOutUTF8 = str2;
        delete [] str1;
        delete[]str2;


        return strOutUTF8;
}


string UTF8ToGBK(const string& strUTF8)
{
        int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
        wchar_t *wszGBK = new wchar_t[len + 1];
        memset(wszGBK, 0, (len + 1)*sizeof(wchar_t));
        MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, wszGBK, len);


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


        delete[]szGBK;
        delete[]wszGBK;


        return strTemp;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值