Linux下字符集转换

在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);

此函数用于关闭转换句柄,释放资源。

[cpp] view plaincopy
  1.     //fromcode:源string使用的字符集,如"UTF-8";,对于汉字每个汉字为3个字节存储  
  2.     //tocode:目的string使用的字符集,如"GB2312";,对于汉字每个汉字为2个字节存储  
  3.     //in:需要转码的字符串  
  4.     //out:转码后的字符串  
  5.     int iconv_code(const string& fromcode, const string& tocode, const string& in, string& out)  
  6.     {     
  7.         char *sin, *sout;  
  8.         size_t lenin, lenout;  
  9.         int ret;  
  10.         iconv_t c_pt;  
  11.   
  12.         if ((c_pt = iconv_open(tocode.c_str(), fromcode.c_str())) == (iconv_t)(-1)){  
  13.             out=in;  
  14.             return -1;  
  15.         }  
  16.           
  17.         lenin = in.size()+1;//字符串要有个结束符位  
  18.         char* oldPasserName = new char[lenin];//这里oldPasserName为工作中用的名字,没什么特殊含义  
  19.         strcpy(oldPasserName, in.c_str());  
  20.           
  21.         lenout = lenin*10;  
  22.         char* newPasserName = new char[lenout];  
  23.   
  24.         sin = oldPasserName;  
  25.         sout = newPasserName;  
  26.         ret = iconv(c_pt, &sin, &lenin, &sout, &lenout);  
  27.         if(ret == -1){  
  28.             out=in;  
  29.             iconv_close(c_pt);  
  30.             return -1;  
  31.         }  
  32.         iconv_close(c_pt);  
  33.           
  34.         out = newPasserName;  
  35.         delete []oldPasserName;//别忘记释放掉  
  36.         delete []newPasserName;  
  37.         return 0;  
  38.     }  

 

你可能感兴趣的:(C++,utf-8,cpp)