gbk转utf-8 iconv 编码转换

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;      //注意这里的返回是重点
}

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

时间: 2024-11-22 22:39:12

gbk转utf-8 iconv 编码转换的相关文章

(转载)GBK、UTF8、UNICODE编码转换

GBK.UTF8.UNICODE编码转换 1 string GBKToUTF8(const std::string& strGBK) 2 { 3 int nLen = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0); 4 WCHAR * wszUTF8 = new WCHAR[nLen]; 5 MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, wszUTF8, nLen);

PHP iconv()编码转换函数用法示例

PHP iconv()字符编码转换函数的用法,iconv()函数,在php5中是内置的,语法格式:iconv("UTF- 8","GB2312//IGNORE",$data) ,//IGNORE的意思是忽略转换错误,如果没有ignore参数,在转换错误时所有该字符后面的字符串都无法被保存..PHP iconv()函数用 法的代码示例: <?php echo $str= '你好,欢迎来到源码爱好者!'; echo '<br />'; echo ico

iconv编码转换指令

看到一个不错的指令iconv,可以对文件编码进行转换,记录如下: iconv --list 列出所有支持转换的编码 icon -f code1 -t code2 filename -o newfile -f 即from 原来的编码 -t 即to 新的编码 filename 待转换的文件名 -o newfile 要输出的文件名

iconv编码转换报错问题

今天,再由ISO-8859编码格式转化为UTF-8格式过程中,出现报错:iconv: 未知 10304 处的非法输入序列. 问题分析:ISO-8859是英文格式的编码方式,不支持中文,为了解决中文支持的问题,出现了GB2312,但GB2312只支持中文简体,为了解决繁体和其它字符支持问题,出现了GBK编码方式,后来又为了支持更多的字符(猜测可能是日文韩文等语言支持)出现了GB18030编码方式.可得出结论ISO8859->GB2312->GBK->GB18030编码方式是依次扩展起来的,

iconv字符编码转换

转自 http://blog.csdn.net/langresser_king/article/details/7459367 iconv(http://www.gnu.org/software/libiconv/)是一个开源的字符编码转换库,可以"方便"的完成几乎所有的编码转换工作.说简单是因为,它常用的接口就三个,iconv_open  iconv   iconv_close,但是即便是只有三个接口,要想使用正确也不容易.这里把一些基本概念和使用细节记录下来,希望能成为一篇最实用的

(转)PHP下编码转换函数mb_convert_encoding与iconv的使用说明

之--http://www.jb51.net/article/21451.htm mb_convert_encoding这个函数是用来转换编码的.原来一直对程序编码这一概念不理解,不过现在好像有点开窍了. 不过英文一般不会存在编码问题,只有中文数据才会有这个问题.比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码. mb_convert_encoding的用法见官方:

php 字符编码转换函数 iconv mb_convert_encoding比较

在使用PHP处理字符串时,我们经常会碰到字符编码转换的问题,你碰到过iconv转换失败吗? 发现问题时,网上搜了搜,才发现iconv原来有bug ,碰到一些生僻字就会无法转换,当然了配置第二个参数时,可以稍微弥补一下默认缺陷,不至于无法转换是截断,用法如下 iconv(“UTF-8″,”GB2312//IGNORE”,$data) ; 这样碰到生僻字转换失败时,它就会忽略失败,继续转换下面的内容,这算解决问题的一个办法,不过为了确保转换的成功率,我们可以用另一个转换函数(mb_convert_e

PHP中编码转换函数iconv()和mb_convert_encoding

在php中转换编码可以用iconv()和mb_convert_encoding,这2个函数都不是php默认的函数,安装方法见百度,这里主要说一下两者的区别. 有些字符在utf8下可编码,在gbk下不可编码,这样在转换时就会出现问题.mb_convert_encoding在遇到这种情况时,会将不可编码的字符都转成了\0x00\0x80,而iconv则在遇到特殊字符时会断掉,但是我们可以在其第二个参数后添加“//IGNORE”,它会忽略遇到的不可编码的字符. PHP中编码转换函数iconv()和mb

PHP下编码转换函数mb_convert_encoding与iconv的使用说明

mb_convert_encoding这个函数是用来转换编码的. 不过英文一般不会存在编码问题,只有中文数据才会有这个问题.比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码. mb_convert_encoding的用法见官方: http://cn.php.net/manual/zh/function.mb-convert-encoding.php 做一个GBK T