• 字符串转码UTF8转码为GBK的C语言程序源代码


    GBK和UTF8之间的转换可以使用MultiByteToWideChar和WideCharToMultiByte两个API,方法是先把它们转换为中间编码Unicode,再转换为对应的编码即可。

    #include <stdio.h>

    #include <windows.h>

    //GBK编码转换到UTF8编码

    int GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen)

    {

    wchar_t * lpUnicodeStr = NULL;

    int nRetLen = 0;

    if(!lpGBKStr) //如果GBK字符串为NULL则出错退出

    return 0;

    nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度

    lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间

    nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码

    if(!nRetLen) //转换失败则出错退出

    return 0;

    nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL); //获取转换到UTF8编码后所需要的字符空间长度

    if(!lpUTF8Str) //输出缓冲区为空则返回转换后需要的空间大小

    {

    if(lpUnicodeStr)

    delete []lpUnicodeStr;

    return nRetLen;

    }

    if(nUTF8StrLen < nRetLen) //如果输出缓冲区长度不够则退出

    {

    if(lpUnicodeStr)

    delete []lpUnicodeStr;

    return 0;

    }

    nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)lpUTF8Str,nUTF8StrLen,NULL,NULL); //转换到UTF8编码

    if(lpUnicodeStr)

    delete []lpUnicodeStr;

    return nRetLen;

    }

    // UTF8编码转换到GBK编码

    int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen)

    {

    wchar_t * lpUnicodeStr = NULL;

    int nRetLen = 0;

    if(!lpUTF8Str) //如果UTF8字符串为NULL则出错退出

    return 0;

    nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度

    lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间

    nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码

    if(!nRetLen) //转换失败则出错退出

    return 0;

    nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,NULL,NULL,NULL,NULL); //获取转换到GBK编码后所需要的字符空间长度

    if(!lpGBKStr) //输出缓冲区为空则返回转换后需要的空间大小

    {

    if(lpUnicodeStr)

    delete []lpUnicodeStr;

    return nRetLen;

    }

    if(nGBKStrLen < nRetLen) //如果输出缓冲区长度不够则退出

    {

    if(lpUnicodeStr)

    delete []lpUnicodeStr;

    return 0;

    }

    nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,(char *)lpGBKStr,nRetLen,NULL,NULL); //转换到GBK编码

    if(lpUnicodeStr)

    delete []lpUnicodeStr;

    return nRetLen;

    }

    //使用这两个函数的例子

    int main()

    {

    char cGBKStr[] = "我是中国人!";

    char * lpGBKStr = NULL;

    char * lpUTF8Str = NULL;

    FILE * fp = NULL;

    int nRetLen = 0;

    nRetLen = GBKToUTF8((unsigned char *)cGBKStr,NULL,NULL);

    printf("转换后的字符串需要的空间长度为:%d ",nRetLen);

    lpUTF8Str = new char[nRetLen + 1];

    nRetLen = GBKToUTF8((unsigned char *)cGBKStr,(unsigned char *)lpUTF8Str,nRetLen);

    if(nRetLen)

    {

    printf("GBKToUTF8转换成功!");

    }

    else

    {

    printf("GBKToUTF8转换失败!");

    goto Ret0;

    }

    fp = fopen("C:GBK转UTF8.txt","wb"); //保存到文本文件

    fwrite(lpUTF8Str,nRetLen,1,fp);

    fclose(fp);

    getchar(); //先去打开那个文本文件看看,单击记事本的“文件”-“另存为”菜单,在对话框中看到编码框变为了“UTF-8”说明转换成功了

    nRetLen = UTF8ToGBK((unsigned char *)lpUTF8Str,NULL,NULL); //再转回来

    printf("转换后的字符串需要的空间长度为:%d ",nRetLen);

    lpGBKStr = new char[nRetLen + 1];

    nRetLen = UTF8ToGBK((unsigned char *)lpUTF8Str,(unsigned char *)lpGBKStr,nRetLen);

    if(nRetLen)

    {

    printf("UTF8ToGBK转换成功! ");

    }

    else

    {

    printf("UTF8ToGBK转换失败! ");

    goto Ret0;

    }

    fp = fopen("C:UTF8转GBK.txt","wb"); //保存到文本文件

    fwrite(lpGBKStr,nRetLen,1,fp);

    fclose(fp);

    getchar(); //再去打开文本文件看看,发现编码框又变为了“ANSI”说明转换成功了

    Ret0:

    if(lpGBKStr)

    delete []lpGBKStr;

    if(lpUTF8Str)

    delete []lpUTF8Str;

    return 0;

    }

    只有想不到,没有做不到!!!
    鸿鹄IT网络学院
  • 相关阅读:
    linux下的mysql安装
    linux下解压zip文件
    解決eclipse 的alt + / 快捷鍵不好用
    linux 源代码目录结构
    Linux(ubuntu)下手动安装 firefox 6 并且添加快捷方式图标
    Ubuntu中配置Tomcat与Eclipse整合
    Linux下的tar压缩解压缩命令详解
    ubuntu创建、删除文件及文件夹,强制清空回收站方法
    九度-题目1011:最大连续子序列
    杭电1003-Max Sum
  • 原文地址:https://www.cnblogs.com/zhongbin/p/3160641.html
Copyright © 2020-2023  润新知