当前位置: 首页 >> 程序设计 >> 编码转换编程
 

编码转换编程

作者:      来源:zz     发表时间:2008-04-20     浏览次数:      字号:    

进行编码转换时,既可以利用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;  
  }

二GBK编码和UTF-8编码的区别

1.
    GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。
    UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8节省空间。

2.
    GBK包含全部中文字符,
    UTF-8则包含全世界所有国家需要用到的字符。

3.
    GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)
    UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。
    比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。所以,对于英文比较多的论坛,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •