GBK和UTF8之间的转换 C语言
来自 :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语言相关推荐
- 编码与乱码(05)---GBK与UTF-8之间的转换--转载
原文地址:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html [GBK转UTF-8] 在很多论坛.网上经常有网友问&q ...
- 汉字编码(【Unicode】 【UTF-8】 【Unicode与UTF-8之间的转换】 【汉字 Unicode 编码范围】【中文标点Unicode码】【GBK编码】【批量获取汉字UNICODE码】)
参考博客: Unicode与UTF-8互转(C语言实现):http://blog.csdn.net/tge7618291/article/details/7599902 汉字 Unicode 编码范围 ...
- ASCII、Unicode、GBK、UTF-8之间的关系
一.ASCII编码 目录 一.ASCII编码 二.GBK编码 三.Unicode编码 四.UTF-8编码 五.Unicode和UTF-8之间的转换 六.Little endian 和 Big endi ...
- [字符集]Unicode和UTF-8之间的转换详解
最近在用VC++开发一个小工具,平时用惯了.NET,用起VC++最郁闷的就是字符串处理.当然最最让人难于琢磨的就是字符集,编码之间的转换.通过这几天的研究,终于明白了Unicode和UTF-8 ...
- Unicode和UTF-8之间的转换详解
Unicode是一个字符集,而UTF-8是 Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1 个字节.U ...
- gbk转utf-8 iconv 编码转换
linux下面有时候 字符需要进行编码转换(爬虫将gbk转为utf-8编码...),一般可以选择iconv函数. 终端下面 输入 man 3 iconv 得到 iconv函数的使用方法. 个人看习 ...
- C/C++笔记(04):GB2312字符串和UTF-8之间的转换
在编程过程中需要对字符串进行不同的转换,特别是Gb2312和Utf-8直接的转换. 在几个开源的魔兽私服中,很多都是国外开发的,而暴雪为了能够兼容世界上的各个字符集也使用了UTF-8.在中国使用VS( ...
- 转发:C++中GB2312字符串和UTF-8之间的转换
在编程过程中需要对字符串进行不同的转换,特别是Gb2312和Utf-8直接的转换.在几个开源的魔兽私服中,很多都是老外开发的,而暴雪为了能 够兼容世界上的各个字符集也使用了UTF-8.在中国使用VS( ...
- ASCII, GB2312, GBK, Unicode, UTF8之间的区别和联系
原文链接:https://zhuanlan.zhihu.com/p/258345888 感谢原作者的分享~本博客仅仅是为了做笔记 计算机是美国人发明的, 早期在处理文字方面, 美国人很自然地只考虑处理 ...
最新文章
- 转:AbstractQueuedSynchronizer的介绍和原理分析
- 安卓APP动态调试技术
- Mozilla Firefox 10.0 beta4 发布
- 解决XML配置文件The markup in the document following the root element must be well-formed报错
- JavaScript中的类方法、对象方法、原型方法
- 华为P50 Pro+高清渲染图曝光:居中单挖孔屏+后置徕卡五摄
- mongodb启动很慢:[initandlisten] found 1 index(es) that
- PHP视频网站源码 带APP源代码 支持FFMPEG
- NIST计划对量子加密进行众测
- 计算机网络奇偶校验码题目,计算机网络试题(考试必备)分解.doc
- TCP/IP协议各层的网络设备
- 曾经的理发店小弟,现在是阿里P10技术大牛
- 配置OpenWRTnbsp;校园网实现amp;nbsp…
- OpenFOAM学习笔记 案例1之Cavity(1)
- 国风就是帅,会三板吗,看看新天吧
- echarts 画中国地图
- Vue $attrs使用方式及使用场景
- license程序设计 系统划分 及加密设计 加密算法调用openssl库
- NSF 与NSR 与GR
- 修复Lsp解决不能上网的问题
热门文章
- Windwos 系统下修改PC的hosts文件,绑定特定的域名和IP地址
- mysql避免回文_谈谈回文子串
- GraphSAGE: 算法原理,实现和应用
- “大数据”离我们有多近?听听华为怎么说!
- Xmanager快速连接Linux图形界面教程
- 三星手机安装linux系统下载,ubuntu手机系统安装教程【详细步骤】
- [10.96.0.1]:443/apis/crd.projectcalico.org/v1/clusterinformations/default: timeout
- android 循环弹幕,Android弹幕效果
- php 文字弹幕效果代码,50行代码搞定弹幕效果
- c语言单链表设计报告,单链表实验报告