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

简介:
在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);
}


本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/231917,如需转载请自行联系原作者
相关文章
|
1月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
91 0
|
1月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
86 1
Linux C/C++之IO多路复用(aio)
|
1月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
38 0
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
319 3
|
1月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
30 0
Linux C/C++之线程基础
|
1月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
25 0
Linux C/C++之IO多路复用(poll,epoll)
|
1月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
38 0
Linux C/C++之TCP / UDP通信
|
1月前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
32 0
Linux c/c++之IPC进程间通信
|
1月前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
30 0
Linux c/c++进程间通信(1)
|
1月前
|
Linux C++
Linux c/c++之进程的创建
这篇文章介绍了在Linux环境下使用C/C++创建进程的三种方式:system函数、fork函数以及exec族函数,并展示了它们的代码示例和运行结果。
40 0
Linux c/c++之进程的创建
下一篇
无影云桌面