C/C++ GBK和UTF8之间的转换
{
关于GBK和UTF-8之间的转换,很多初学者会很迷茫。
一般来说GBK和UTF-8是文字的编码方式,其对应的内码是不一样的,所以GBK和UTF-8的转换需要对内码进行一一映射,然后进行转换。
对于一般系统上的工程,一般使用libiconv即可,但是对于嵌入式或手机操作系统,libiconv显得就有点庞大了。
在这里提供GBK和UTF8转换以及全半角、大小写转换等函数,希望对手机开发的同学有所帮助,特别是在iOS上开发的同学。
具体全半角、简繁体转换使用方法见下代码:
#include "strnormalize.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
str_normalize_init();
unsigned options = SNO_TO_LOWER | SNO_TO_HALF;
if (argc > 1) options = atoi(argv[1]);
char *buffer = (char *)malloc(65536);
memset(buffer, 0, 65536);
while (fgets(buffer, 65536, stdin))
{
str_normalize_utf8(buffer, options);
printf("%s", buffer);
}
free(buffer);
return 0;
}
UTF-8和GBK转换使用方法如下:
#include "strnormalize.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
int main(int argc, char **argv)
{
str_normalize_init();
const char *utf8 = "我是utf-8字符!";
const char *gbk = "����GBK�ַ���";
uint32_t utf8_len = strlen(utf8);
uint32_t gbk_len = strlen(utf8);
uint32_t utf8buffer_len = utf8_len * 3 + 1;
uint32_t gbkbuffer_len = gbk_len * 2 + 1;
char *utf8buffer = (char *)malloc(utf8buffer_len);
char *gbkbuffer = (char *)malloc(gbkbuffer_len);
memset(utf8buffer, 0, utf8buffer_len);
memset(gbkbuffer, 0, gbkbuffer_len);
utf8_to_gbk(utf8, utf8_len, &gbkbuffer, &gbkbuffer_len);
gbk_to_utf8(gbk, gbk_len, &utf8buffer, &utf8buffer_len);
printf("utf8: %s<=>%d \t gbkbuffer: %s<=>%d\n", utf8, utf8_len, gbkbuffer, gbkbuffer_len);
printf("gbk: %s<=>%d \t utf8buffer: %s<=>%d\n", gbk, gbk_len, utf8buffer, utf8buffer_len);
free(utf8buffer);
free(gbkbuffer);
return 0;
}
/**
* Copyright(c) 2012-2013, All Rights Reserved.
*
* @file strnormalize.h
* @details Check GBK character you could do
* code >= 0x8000 && _pGbk2Utf16[code - 0x8000] != 0
* @author cnangel
* @version 1.0.0
* @date 2012/10/09 11:44:58
*/ #ifndef __STRNORMALIZE_H__
#define __STRNORMALIZE_H__ #ifdef __cplusplus
extern "C" {
#endif #define SNO_TO_LOWER 1
#define SNO_TO_UPPER 2
#define SNO_TO_HALF 4
#define SNO_TO_SIMPLIFIED 8 void str_normalize_init();
void str_normalize_gbk(char *text, unsigned options);
void str_normalize_utf8(char *text, unsigned options); int gbk_to_utf8(const char *from, unsigned int from_len, char **to, unsigned int *to_len);
int utf8_to_gbk(const char *from, unsigned int from_len, char **to, unsigned int *to_len); #ifdef __cplusplus
}
#endif #endif /* __STRNORMALIZE_H__ */
}
C/C++ GBK和UTF8之间的转换的更多相关文章
- 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换
原文出自:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html 在很多论坛.网上经常有网友问" 为什么我使用 ...
- 编码与乱码(05)---GBK与UTF-8之间的转换--转载
原文地址:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html [GBK转UTF-8] 在很多论坛.网上经常有网友问“ ...
- 汉字编码(【Unicode】 【UTF-8】 【Unicode与UTF-8之间的转换】 【汉字 Unicode 编码范围】【中文标点Unicode码】【GBK编码】【批量获取汉字UNICODE码】)
Unicode与UTF-8互转(C语言实现):http://blog.csdn.net/tge7618291/article/details/7599902 汉字 Unicode 编码范围:http: ...
- 举例说明Unicode 和UTF-8之间的转换
1)写这篇博客的原因 首先我要感谢这篇博客,卡了很久,看完下面这篇博客终于明白Unicode怎么转换成UTF-8了. https://blog.csdn.net/qq_32252957/article ...
- Unicode和UTF-8之间的转换
转自:http://www.cnblogs.com/xdotnet/archive/2007/11/23/unicode_and_utf8.html#undefined 最近在用VC++开发一个小工具 ...
- GBK与UTF-8编码错误转换后,无法再正确恢复
字符集错误转换导致的问题 UTF-8格式编码的字节流,按GBK字符集转换为字符串,会出现乱码,这很正常.但将其重新转为字节流,再用UTF-8字符集转为字符串,还是乱码.这就让我产生了疑惑,虽然使用错误 ...
- gbk转utf-8 iconv 编码转换
linux以下有时候 字符须要进行编码转换(爬虫将gbk转为utf-8编码...).一般能够选择iconv函数. 终端以下 输入 man 3 iconv 得到 iconv函数的用法. 个人看习惯了 ...
- C++中GB2312字符串和UTF-8之间的转换
在编程过程中需要对字符串进行不同的转换,特别是Gb2312和Utf-8直接的转换.在几个开源的魔兽私服中,很多都是老外开发的,而暴雪为了能 够兼容世界上的各个字符集也使用了UTF-8.在中国使用VS( ...
- 基于Poco的UTF8、UTF16、GBK、Hex之间的转换
/******Encoding.h*******/ #include "Poco/UnicodeConverter.h" #include "Poco/Exception ...
随机推荐
- Java Thread之start和run方法的区别
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421515.html start 用start方法来启动线程,真正实现了多线程运行,这时无需等待ru ...
- mitmproxy 代理介绍及入门
转载请注明出处 https://www.cnblogs.com/majianming/p/11823669.html mitmproxy 是一个python 写成的代理工具,可以代理https.htt ...
- vim常用的骚操作
1.设置~/.vimrc syntax on 支持语法高亮 set nu 显示行号set nonu 不显示行号 set ai 设置自动缩进 set ...
- 【Flutter学习】页面跳转之SliverAppBar,CustomScrollView,NestedScrollView的使用
一,flutter SliverAppbar 控件介绍 SliverAppBar “应用栏” 相当于升级版的 appbar 于 AppBar 位置的固定的应用最上面的; 而 SliverAppBar ...
- Android中的ImageView的getDrawableCache获取背景图片的时候注意的问题
获取ImageView的背景图片使用getDrawableCache方法,不要使用getDrawable方法,后者获取不到图片的. 1.在调用imageView.getDrawableCache()之 ...
- Python每日一题 005
任一个英文的纯文本文件,统计其中的单词出现的个数. 代码 # coding:utf-8 import re def get_word(filename): fp=open(filename," ...
- Excel表格 函数
1.四则运算(加.减.乘.除).求和.平均.计数.最值. 2. 逻辑函数 (IF函数.NOT函数.等) 3.时间和日期 ( NOW 返回当前日期和时间.等) 4.数学与三角函数 5.文本 ( LOWE ...
- if(!confirm("您确定删除吗?")){return;}
if(!confirm("您确定删除吗?")){return;}
- PowerDesigner小技巧(整理中)
1.在修改name的时候,code的值将跟着联动 修改方法:PowerDesign中的选项菜单里修改,在[Tool]-->[General Options]->[Dialog]->[ ...
- 21. Blog接口开发
一般的系统由登录.增删改查所组成.我们的Blog同样如此.我们会开发登录.创建博客.删除博客.修改博客.查询博客等功能.话不多说,我们直接展开实践吧. 思路分析 创建项目.既然我们要创建一个blog, ...