linux下C语言utf-8编码与gb2312转换代码---libiconv

UTF-8,Unicode,GB2312编码转换(C语言) UTF-8,Unicode,GB2312编码转换(C语言) 最近在做MQTT客户端的时候,遇到需要将输入的GB2312中文转换为UTF8的问题,这边做一个整理。 UTF-8转GB2312 /*! * \brief Gb2312至UTF8 转换函数 * * \details Gb2312 -> Unicode -> UTF8 * * \param const ch... 阅读详情
linux下C语言utf-8编码与gb2312转换代码
2010-04-02 14:09


int code_convert(char *from_charset, char *to_charset, char *inbuf, int inlen, char *outbuf, int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset, from_charset);

if (cd == 0) 
return 1;

memset(outbuf, 0, outlen);

if (iconv(cd, pin, &inlen, pout, &outlen) == -1) 
return 1;

iconv_close(cd);
return 0;
}



我也发一个自己写的程序,一直在用的

/******************************************************
EncodingConv.c
使用iconv进行字符编码转换
SUNLAN
2006/08/17
******************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>
#include <errno.h>
#include "SDKpub.h"

#ifndef ERRFILE
#define ERRFILE "errlog"
#endif

char * EncodingConv(  const char * in, char *encFrom, char *encTo )
{

char *buff, *sin, *sout;
int lenin, lenout;
iconv_t ct;

if( (ct=iconv_open(encTo, encFrom)) == (iconv_t)-1 )
{
SDKerrlog( ERRFILE, "%s|%d| iconv_open error! %s", __FILE__,
__LINE__, strerror(errno) );
return( NULL );
}

iconv( ct, NULL, NULL, NULL, NULL );

sin = (char *)in;
lenin  = strlen(in) + 1;

if( (buff=malloc( lenin*2 ))==NULL )
{
SDKerrlog( ERRFILE, "%s|%d| malloc error! %s", __FILE__, __LINE__,
strerror(errno) );
iconv_close( ct );
return( NULL );
}
sout   = buff;
lenout = lenin*2;

if( iconv( ct, &sin, (size_t *)&lenin, &sout, (size_t *)&lenout) == -1 )
{
SDKerrlog( ERRFILE, "%s|%d| iconv() error! errno=%d %s", __FILE__,
__LINE__, errno, strerror(errno) );
free( buff );
iconv_close( ct );
return NULL;
}

iconv_close( ct );

sout=strdup(buff);
free( buff );

return( sout );
}

over

linux C C++ 字符集转换,UTF-8,GB2312



http://jazka.blog.51cto.com/809003/231917

在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。 
一、利用iconv函数族进行编码转换 
iconv函数族的头文
在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。 
一、利用iconv函数族进行编码转换 
iconv函数族的头文件是iconv.h,使用前需包含之。 
#include <iconv.h> 
iconv函数族有三个函数,原型如下: 
(1) iconv_t iconv_open(const char *tocode, const char *fromcode); 
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。 
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft); 
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。 (3) int iconv_close(iconv_t cd); 
此函数用于关闭转换句柄,释放资源。 
例子1: 用C语言实现的转换示例程序 

/* f.c : 代码转换示例C程序 */ 
#include <iconv.h> 
#define OUTLEN 255 
main() 
{ 
char *in_utf8 = "姝e?ㄥ??瑁?"; 
char *in_gb2312 = "正在安装"; 
char out[OUTLEN]; 

//unicode码转为gb2312码 
rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN); 
printf("unicode-->gb2312 out=%sn",out); 
//gb2312码转为unicode码 
rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN); 
printf("gb2312-->unicode out=%sn",out); 
} 
//代码转换:从一种编码转为另一种编码 
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen) 
{ 
iconv_t cd; 
int rc; 
char **pin = &inbuf; 
char **pout = &outbuf; 

cd = iconv_open(to_charset,from_charset); 
if (cd==0) return -1; 
memset(outbuf,0,outlen); 
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1; 
iconv_close(cd); 
return 0; 
} 
//UNICODE码转为GB2312码 
int u2g(char *inbuf,int inlen,char *outbuf,int outlen) 
{ 
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen); 
} 
//GB2312码转为UNICODE码 
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen) 
{ 
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); 
} 

例子2: 用C++语言实现的转换示例程序 

/* f.cpp : 代码转换示例C++程序 */ 
#include <iconv.h> 
#include <iostream> 

#define OUTLEN 255 

using namespace std; 

// 代码转换操作类 
class CodeConverter { 
private: 
iconv_t cd; 
public: 
// 构造 
CodeConverter(const char *from_charset,const char *to_charset) { 
cd = iconv_open(to_charset,from_charset); 
} 

// 析构 
~CodeConverter() { 
iconv_close(cd); 
} 

// 转换输出 
int convert(char *inbuf,int inlen,char *outbuf,int outlen) { 
char **pin = &inbuf; 
char **pout = &outbuf; 

memset(outbuf,0,outlen); 
return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen); 
} 
}; 

int main(int argc, char **argv) 
{ 
char *in_utf8 = "姝e?ㄥ??瑁?"; 
char *in_gb2312 = "正在安装"; 
char out[OUTLEN]; 

// utf-8-->gb2312 
CodeConverter cc = CodeConverter("utf-8","gb2312"); 
cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN); 
cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl; 

// gb2312-->utf-8 
CodeConverter cc2 = CodeConverter("gb2312","utf-8"); 
cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN); 
cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl; 
}
 
linux C 字符集转换,UTF-8,GB2312
最近帮朋友写个系统接口的小东东,2个系统字符集不同,一个采用UTF-8,一个采用GB2312,不得已需要转换字符集。转换函数记录如下:
#include <iconv.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OUTLEN 255
main()
{
char *in_utf8 = "utf8字符串";
char *in_gb2312 = "\xbe\xb2\xcc\xac\xc4\xa3\xca\xbd";

char out[OUTLEN];
int rec ;

//unicode码转为gb2312码
rec = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf("unicode-->gb2312 out=%s\n",out);

//gb2312码转为unicode码
rec = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf("gb2312-->unicode out=%s \n",out);
}
//代码转换:从一种编码转为另一种编码
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);

C语言实战:手搓UTF-8与GBK互转码表,告别臃肿第三方库 本文详细介绍了如何在C语言中手动实现UTF-8与GBK编码互转,避免使用臃肿的第三方库。通过构建高效的编码对照表和二分查找算法,开发者可以在资源受限的嵌入式环境中实现轻量级字符编码转换,显著提升性能和减少内存占用。 阅读详情

相关推荐

从编码战争到统一:libiconv如何成为多语言开发的桥梁

本文探讨了libiconv在多语言开发中的关键作用,解析了其技术架构和实战应用。作为编码转换的瑞士军刀,libiconv支持包括UTF-8在内的200多种编码格式,有效解决了跨平台开发中的乱码问题。文章还提供了性能优化技巧和现代开发中的最佳实践,帮助开发者高效处理多语言文本转换。

weixin_29007809的博客 372

C语言转化编码格式(UTF8转GB2312)

【代码】C语言转化编码格式(UTF8转GB2312)

qq_37377257的博客 1556

C++编码转换实战:GBK与UTF-8互转原理、方案与避坑指南

字符编码是计算机存储和处理文本信息的基础规则,它定义了字符与字节序列之间的映射关系。在跨平台、多语言环境中,不同的编码标准(如ASCII、GBK、UTF-8)共存,导致数据交换时出现乱码问题。其核心原理在于编码格式的差异,例如GBK采用双字节定长编码,而UTF-8采用变长编码,直接进行字节拷贝无法正确转换。掌握可靠的编码转换技术,对于构建健壮的软件系统至关重要,尤其在处理中文文本、文件读写、网络通信等场景。本文聚焦于C++开发中常见的GBK与UTF-8互转需求,通过对比系统API、标准库及第三方库等方案,并

383

C语言实现GB2312和UTF8之间的编码转换

C语言实现GB2312和UTF8之间的编码转换 GB2312 GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,基本集共收入汉字6763个和非汉字图形字符682个。GB2312中对所收汉字进行了“分区”处理,字符集分成94个区,每区含有94个汉字/符号,这种表示方式也称为区位码。 01-09区为特殊符号。 16-55区为一级汉字,按拼音排序。 56-87区为二级汉字,按部首/笔画排序。 10-15区及88-94区则未有编码。 举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是160

仰天大笑出门去 9234

利用libiconv解决autocutsel跨平台中文乱码问题

本文详细介绍了如何通过修改autocutsel源码并集成libiconv库,解决Windows与Linux系统间剪贴板同步时的中文乱码问题。核心方案是利用libiconv进行GBK到UTF-8的编码转换,提供了从环境配置、源码编译到实际部署的完整步骤,有效提升了跨平台工作的效率。

weixin_29285605的博客 320

Linux C编程:实现字符集转换(UTF-8与GB2312)

字符集转换涉及到将一个字符从一种字符集编码转换为另一种字符集编码的过程。UTF-8是一种变长编码,可以表示全球范围内的字符,而GB2312则是一种固定长度编码,主要用于中文字符。通过使用iconv库,我们可以在Linux C编程中轻松实现UTF-8与GB2312之间的字符集转换。本文将介绍如何使用C语言实现UTF-8与GB2312之间的字符集转换,并提供相应的源代码。运行上述程序,将输出转换后的GB2312编码的字符串:“GB2312编码的字符串: 你好,世界!,并分配了足够的内存来存储转换后的字符串。

2301_79326559的博客 817

libiconv 交叉编译和调用方法(UTF-8和GB2312转换)

1、解压 libiconv-1.14.tar.gz;进入libiconv-1.14目录 2、./configure --host=arm-linux-none-gnueabi-gcc --enable-shared --enable-static --prefix=/opt/libiconv/      /*--enable-shared  共享  --enable-static 生成静态库*/

wuyu92877的专栏 8932

C语言实现UCS2、UTF8与GBK2312编码转换

在软件开发中,字符编码是一个非常重要的概念。不同的编码方式用于在不同的系统和应用中表示文本数据。UCS2、UTF8和GBK2312是三种常见的字符编码方式。为了实现不同编码间的转换,我们可以使用C语言进行编程,利用已有的库或者手动实现转换算法。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 4166

字符转码--iconv工具包

iconv命令可以将一种已知的字符集文件转换成另一种已知的字符集文件,它的作用是在多种国际编码格式之间进行文本内码的转换。 linux下函数原型 size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); linux系统下字符默认编码为utf-8,17搜索中...

weixin_33693070的博客 153

matlab tolx,Nelder-Mead算法matlab

Nelder-Mead算法适合变量数不是很多的方程求极值.原理:Nelder-Mead法是利用多面体来逐步逼近最佳点x*.设函数变量为n维,则在n维空间里多面体有(n+1)个顶点.设x1,x2,...,xn+1为多面体的顶点,且满足:f(x1)<=f(x2)<=...<=f(xn+1)Nelder-Mead法试着将多面体中最差的顶点xn+1(也就是函数的最大点)以新的最佳点替代,...

weixin_36485298的博客 1480

断点回归(regression discontinuity design)学习笔记

本篇博文主要是对断点回归的一些学习和总结~ 学习材料如下: 1 断点回归设计RDD分类与操作案例 2 RDD断点回归, Stata程序百科全书式的宝典 3 断点回归设计的前沿研究现状, RDD 4 让“跳跃”更有意义:断点回归设计(RDD) 5 Stata: 断点回归 (RDD) 教程 6 怎么用通俗的语言解释断点回归?它与DID的区别是什么 7 Watering Down Environmental Regulation in China,Guojun He, Shaoda Wang, Bing Zhan

Claire_chen_jia的博客 9万+

linux文件字符集转换(utf8-gb2312)

一,命令行 在LINUX上进行编码转换时,可以利用iconv命令实现,这是针对文件的,即将指定文件从一种编码转换为另一种编码。 iconv命令用法如下: iconv [选项...] [文件...] 1.输入/输出格式规范:   -f, --from-code=名称 原始文本编码   -t, --to-code=名称 输出编码 2.列举所有已知的字符集  -l, -

u010871058的专栏 5243

Linux c++/c UTF-8 GB2312中文转码实现

#include <iconv.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define OUTLEN 255 //代码转换:从一种编码转为另一种编码 int code_convert(char *from_charset,char *to_charset...

zuiyijiangnan的博客 1909

BOSS直聘数据采集、解析处理、分析与可视化实战

招聘和求职是一对永恒的话题,不论什么时候都有招聘或者是求职的需求,找不找得到工作可能最主要的就是匹配度是否高,待遇福利是否诱人,如今互联网的快速发展,找工作的方式早已发生了翻天覆地的变化,从以往的面对面形式的招聘简历投递和面试方式,变成了电子简历网络直接投递、远程面试录用的形式,便捷性大大提升,需求的快速增长,促生了一批互联网招聘类的企业,诸如:51job、BOSS直聘、拉勾网等等,为了能...

Together_CZ的博客 9026

CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略

草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。......

走向CTO之路 1936

40.linux下安装libiconv库:GB2312与UTF-8转码测试

目录一: libiconv库简介:二:下载:三:编译:四:测试: 一: libiconv库简介: libiconv库为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。 随着互联网时代的到来,通过互联网进行文字交流也逐渐增多:浏览外国的网站,这个时候字符编码的转换变得尤为重要。这带来了一个问题,就是许多字符在某一种编码方式中没有。为了解决这种混乱,Unicode的编码方式被建立。Unicode是一种超级编码包含了所有这些编码的字符集,因此一些新的文本格式像XML的默认

yanghangwww的博客 1008

ShowDoc item_id 未授权SQL注入漏洞复现

2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前置条件,易于利用,且默认情况下可暴破用户token获取系统后台权限,建议所有使用该系统的企业尽快升级修复,以确保系统安全。

0xSec 2360

linux修改字符串编码为gb,linux ICONV字符GB2312转换UTF8

#iconv -f GB2312 -t UTF-8 gb1.txt >gb2.txt将gb1里的编码从GB2312转化成UTF-8并重定向到gb2.txt除了iconv命令,我们在linux系统下的man page的第三节还可以看到一组iconv函数。它们分别是iconv_t iconv_open(const char *tocode, const char *fromcode);...

weixin_39974958的博客 432

[deprecated]第四章:TTM分析: 4.2.1 存储分配ttm_bo_validate功能实现分析

ttm_bo_validate是TTM框架中负责验证和调整BufferObject物理内存分配的核心函数,主要用于显存管理。该函数通过placement参数判断BO是否需要迁移或重新分配资源,完成内存分配、迁移及缓存策略调整等操作。实现流程包括资源释放、兼容性检查、迁移保护、新资源分配、迁移实现等步骤,支持多跳迁移和临时缓冲区。典型应用于显存溢出迁移、缓存策略调整、驱动初始化等场景,确保BO始终处于预期状态。

图形/计算GPU的驱动与虚拟化技术分享园地 849

【软考高项论文】论信息系统项目管理的干系人绩效域

例如,在处理与电信运营商合作铺设光纤网络的问题时,考虑到其在通信设施建设和运维方面的专业性和重要性,我们将之定位为高权力高利益的干系人,给予了高度关注和优先沟通。项目全程,我们对干系人绩效域的执行效果进行了定期检查和评估,通过定量与定性的数据收集,确认了项目在干系人管理上的成效,具体表现为:建立了稳固的工作关系网络,使干系人普遍认可项目目标;鉴于本项目牵涉到政府各级部门、企事业单位、市民团体、技术研发伙伴等多种类型的干系人,且干系人的诉求和影响力各异,因此,有序且持续的干系人参与管理显得尤为关键。

Programming Talk 1683

linux c语言 utf8转gbk,GBK(gb2312)和UTF-8互转(转载)

本文摘自:http://my.huhoo.net/archives/2012/10/gbkutf8.html非常感谢原文作者。具体需求是这样,嵌入式环境,sh架构的,厂商提供的SDK中的iconv库不够全,不支持gb2312,也不支持gbk,导致我在实现utf-8转gb2312编码时不能通过标准iconv库完成。最终找到两个解决办法。1. 使用网上流传比较广泛的preload技术,从gnu网站上d...

weixin_27215403的博客 1512

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ARM开发板上iconv_open(“utf-8", "gb2312”) 调用失败的解决方法

ARM开发板上iconv_open("utf-8", "gb2312") 调用失败的解决方法 应用程序代码如下: static int code_convert(char* from_charset, char* to_charset,         char* inbuf, size_t inlen, char* outbuf, size_t outlen) {     icon

willis 3861

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux C++字符集转换实战:基于iconv的GBK/UTF-8编码处理方案

字符集与编码是计算机处理文本信息的基础,它定义了字符与二进制数据的映射规则。在跨平台、多语言环境的软件开发中,不同的字符集编码(如GBK、UTF-8)会导致数据交换时出现乱码问题,其核心原理在于编码规则的不匹配。正确处理字符集转换对于保障数据的一致性与可读性具有重要技术价值,尤其在涉及文件I/O、网络传输、终端显示及与第三方库交互的应用场景中。本文聚焦于在Linux C++环境下,通过封装iconv库,实现一套高效、可靠的字符集转换方案,重点解决GBK与UTF-8编码间的互转难题,并提供了完整的RAII风格

weixin_34128237的博客 466

GBK(gb2312)和UTF-8互转(转载)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33963189的博客 521
上一篇: UTF-8, Unicode, GB2312格式串转换之C语言版
下一篇: gcc命令行详解
zljjava
博客等级 码龄15年 155粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值