linux下面有时候 字符需要进行编码转换(爬虫将gbk转为utf-8编码...),一般可以选择iconv函数。
终端下面 输入
man 3 iconv
个人看习惯了,msdn文档之后感觉linux下面的文档的看的不是那么爽了。
使用iconv函数进行转码,一般使用三个函数:iconv_open 、 iconv 、iconv_close三个函数。
iconv_t iconv_open(const char* tocode,const char* fromcode)
终端下面输入下面命令得到系统支持的编码:
iconv --list
size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);具体函数内容可以查看这个网页iconv_open iconv iconv_close函数文档
使用完成之后,需要关闭之前打开的句柄 :
int iconv_close(iconv_t cd);
例子:
头文件:CTranstlateString.h
#ifndef CTRANSTLATESTRING_H #define CTRANSTLATESTRING_H #include <string> #include <iostream> #include <iconv.h> class CTranstlateString { public: CTranstlateString(const char *to_encode , const char *from_encode); const char* Translate(const char* from, size_t flen); //字符串转换 virtual ~CTranstlateString(); protected: private: char* fromstring; //字符串 char* tostring; // size_t fromleng;//带转换字符串预备长度 size_t toleng; // iconv_t handle; const char* InTranlsate(); //正真的字符串函数 }; #endif // CTRANSTLATESTRING_H
文件:CTranstlateString.cpp
#include <string.h>
#include "CTranstlateString.h"
using namespace std;
CTranstlateString::CTranstlateString(const char *to_encode , const char *from_encode)
{
fromstring = new char[1];
fromleng = 1;
tostring = new char[1];
toleng = 1;
handle = iconv_open( to_encode , from_encode );
}
CTranstlateString::~CTranstlateString()
{
delete[] fromstring;
fromleng = 0;
delete[] tostring;
toleng = 0;
iconv_close(handle);
}
const char* CTranstlateString::Translate(const char* from ,size_t flen)
{
if( fromleng < flen+1 ) //将待 编码的字符串 存储起来
{
delete[] fromstring;
fromstring = NULL;
fromleng = 0;
try
{
fromstring = new char[flen+1];
fromleng = flen + 1;
}
catch(...)
{
fromstring = NULL;
fromleng = 0 ;
return NULL;
}
}
memset( fromstring , 0 , fromleng );
memcpy(fromstring, from, fromleng);
size_t tlen = flen * 2;
//分类 编码后的字符串空间
if( toleng < tlen +1 )
{
delete[] tostring;
tostring = NULL;
toleng = 0;
try
{
tostring = new char[tlen + 1];
toleng = tlen + 1;
}
catch (...)
{
tostring = NULL;
toleng = 0;
return NULL;
}
}
memset(tostring, 0, toleng);
return InTranlsate(); //字符串转码
}
const char* CTranstlateString::InTranlsate()
{
size_t outlen = toleng ;
char *inbuf = fromstring;
char *outbuf = tostring ;
size_t inlen = fromleng;
if ( -1 == iconv( handle ,&inbuf , &inlen , &outbuf , &outlen ) )
{
return "";
}
return tostring; //注意这里的返回是重点
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/midle110/article/details/46945905