VC++ UTF-8与GBK格式转换

声明:本人一个菜鸟,网上搜罗了很多关于VC++编程的资料,可每本资料都是涵盖面太广,难以细致。英语又太烂,所以不得意只得摸索,恐又忘记所以记在此处,若有不对的地方,烦劳指出,不胜感激。

author:fym0121@163.com

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




版权声明:本文为fym0121原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。