码迷,mamicode.com
首页 > 其他好文 > 详细

gbk转utf-8 iconv 编码转换

时间:2015-07-18 22:47:45      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:iconv   编码   utf-8   gbk   爬虫   

linux下面有时候 字符需要进行编码转换(爬虫将gbk转为utf-8编码...),一般可以选择iconv函数。

终端下面  输入    

man 3 iconv

得到  iconv函数的使用方法。

个人看习惯了,msdn文档之后感觉linux下面的文档的看的不是那么爽了。

使用iconv函数进行转码,一般使用三个函数:iconv_open  、 iconv  、iconv_close三个函数。

iconv_t iconv_open(const char* tocode,const char* fromcode)

返回值类似文件句柄的东西,tococode:目标编码,fromcode:来源编码。

终端下面输入下面命令得到系统支持的编码:

iconv --list


然后就是转码函数了:

size_t iconv(iconv_t cd,             char **inbuf, size_t *inbytesleft,
            char **outbuf, size_t *outbytesleft);

cd:刚才iconv_open得到的句柄, inbuf: 需要转码的字符串地址的指针 , inbytesleft:需要转码的长度,outbuf:输出空间 , 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;      //注意这里的返回是重点
}







版权声明:本文为博主原创文章,未经博主允许不得转载。

gbk转utf-8 iconv 编码转换

标签:iconv   编码   utf-8   gbk   爬虫   

原文地址:http://blog.csdn.net/midle110/article/details/46945905

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!