Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343664
  • 博文数量: 82
  • 博客积分: 2602
  • 博客等级: 少校
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-10 08:48
文章分类

全部博文(82)

文章存档

2008年(17)

2007年(65)

分类: C/C++

2007-11-05 15:51:14

LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。  
  一、利用iconv函数族进行编码转换  
  iconv函数族的头文件是iconv.h,使用前需包含之。  
  #include    
  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    
  #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    
  #include    
   
  #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英文却只占一个字节。

阅读(1458) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

xinyu3912008-06-05 14:30:03

抱歉,GBK编码 对英文字符也是两个字节吗? 我测试了一下,不是两个自己是一个字节啊。