来自 :http://www.diybl.com/course/3_program/c++/cppsl/2008320/105871.html

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

在网上看到的一些文章说,UTF8转换为GBK的时候会有问题,特别是当UTF8字符串中的汉字数为奇数时。关于这个问题我没有去验证过,而且我对UTF8和GB2312的编码还不是很熟悉,呵呵,等以后有空的时候再去了解一下编码吧。

GBK和UTF8之间的转换 C语言相关推荐

  1. 编码与乱码(05)---GBK与UTF-8之间的转换--转载

    原文地址:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html [GBK转UTF-8] 在很多论坛.网上经常有网友问&q ...

  2. 汉字编码(【Unicode】 【UTF-8】 【Unicode与UTF-8之间的转换】 【汉字 Unicode 编码范围】【中文标点Unicode码】【GBK编码】【批量获取汉字UNICODE码】)

    参考博客: Unicode与UTF-8互转(C语言实现):http://blog.csdn.net/tge7618291/article/details/7599902 汉字 Unicode 编码范围 ...

  3. ASCII、Unicode、GBK、UTF-8之间的关系

    一.ASCII编码 目录 一.ASCII编码 二.GBK编码 三.Unicode编码 四.UTF-8编码 五.Unicode和UTF-8之间的转换 六.Little endian 和 Big endi ...

  4. [字符集]Unicode和UTF-8之间的转换详解

        最近在用VC++开发一个小工具,平时用惯了.NET,用起VC++最郁闷的就是字符串处理.当然最最让人难于琢磨的就是字符集,编码之间的转换.通过这几天的研究,终于明白了Unicode和UTF-8 ...

  5. Unicode和UTF-8之间的转换详解

    Unicode是一个字符集,而UTF-8是 Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1 个字节.U ...

  6. gbk转utf-8 iconv 编码转换

    linux下面有时候 字符需要进行编码转换(爬虫将gbk转为utf-8编码...),一般可以选择iconv函数. 终端下面  输入 man 3 iconv 得到  iconv函数的使用方法. 个人看习 ...

  7. C/C++笔记(04):GB2312字符串和UTF-8之间的转换

    在编程过程中需要对字符串进行不同的转换,特别是Gb2312和Utf-8直接的转换. 在几个开源的魔兽私服中,很多都是国外开发的,而暴雪为了能够兼容世界上的各个字符集也使用了UTF-8.在中国使用VS( ...

  8. 转发:C++中GB2312字符串和UTF-8之间的转换

    在编程过程中需要对字符串进行不同的转换,特别是Gb2312和Utf-8直接的转换.在几个开源的魔兽私服中,很多都是老外开发的,而暴雪为了能 够兼容世界上的各个字符集也使用了UTF-8.在中国使用VS( ...

  9. ASCII, GB2312, GBK, Unicode, UTF8之间的区别和联系

    原文链接:https://zhuanlan.zhihu.com/p/258345888 感谢原作者的分享~本博客仅仅是为了做笔记 计算机是美国人发明的, 早期在处理文字方面, 美国人很自然地只考虑处理 ...

最新文章

  1. 转:AbstractQueuedSynchronizer的介绍和原理分析
  2. 安卓APP动态调试技术
  3. Mozilla Firefox 10.0 beta4 发布
  4. 解决XML配置文件The markup in the document following the root element must be well-formed报错
  5. JavaScript中的类方法、对象方法、原型方法
  6. 华为P50 Pro+高清渲染图曝光:居中单挖孔屏+后置徕卡五摄
  7. mongodb启动很慢:[initandlisten] found 1 index(es) that
  8. PHP视频网站源码 带APP源代码 支持FFMPEG
  9. NIST计划对量子加密进行众测
  10. 计算机网络奇偶校验码题目,计算机网络试题(考试必备)分解.doc
  11. TCP/IP协议各层的网络设备
  12. 曾经的理发店小弟,现在是阿里P10技术大牛
  13. 配置OpenWRTnbsp;校园网实现amp;nbsp…
  14. OpenFOAM学习笔记 案例1之Cavity(1)
  15. 国风就是帅,会三板吗,看看新天吧
  16. echarts 画中国地图
  17. Vue $attrs使用方式及使用场景
  18. license程序设计 系统划分 及加密设计 加密算法调用openssl库
  19. NSF 与NSR 与GR
  20. 修复Lsp解决不能上网的问题

热门文章

  1. Windwos 系统下修改PC的hosts文件,绑定特定的域名和IP地址
  2. mysql避免回文_谈谈回文子串
  3. GraphSAGE: 算法原理,实现和应用
  4. “大数据”离我们有多近?听听华为怎么说!
  5. Xmanager快速连接Linux图形界面教程
  6. 三星手机安装linux系统下载,ubuntu手机系统安装教程【详细步骤】
  7. [10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: timeout
  8. android 循环弹幕,Android弹幕效果
  9. php 文字弹幕效果代码,50行代码搞定弹幕效果
  10. c语言单链表设计报告,单链表实验报告