视频安防监控平台-GB2312和UTF-8在linux下面的转换

版权声明:本文为博主原创文章,未经博主允许不得转载。QQ/微信联系:123011785 https://blog.csdn.net/songxiao1988918/article/details/79025802

                             视频安防监控平台-GB2312和UTF-8在linux下面的转换

在GB28181项目里面经常会使用到GB2312和utf8的中文字符转换,下面简单粘贴一份使用的格式转码源码:

////////////////////////////////////////////////////////////////////////////////
// 版权说明, 2010-2020, 
////////////////////////////////////////////////////////////////////////////////
// 文件名 :   CodeConvertMgr.h
// 作  者 :
// 版  本 :   1.0
// 日  期 :   2016-07-08
// 功能描述:  处理所有的转码
// 其他说明:  目前只处理UTF8 和GB2312的转码
//
// 修改历史:
// 日期(YYYY-MM-DD)     版本        修改人        修改内容
//       2016-07-08		  1.0		  宋小文 	    初始创建
////////////////////////////////////////////////////////////////////////////////
#ifndef __CODECONVERT_MGR_H__
#define __CODECONVERT_MGR_H__

#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>
#include <iostream>
#include <string>
#include <string.h>

using namespace std;

/* Code (GB2312 <--> UTF-8) Convert Class */
class CCodeConverter
{
private:
	iconv_t cd;

public:
	
	CCodeConverter(const char *pFromCharset,const char *pToCharset) 
	{
		cd = iconv_open(pToCharset, pFromCharset);
		if ( (iconv_t)(-1) == cd)
		{
			printf("%s: failed to set <%s --> %s>", __FUNCTION__, pFromCharset, pToCharset);	
		}
	}
	~CCodeConverter() 
	{
		iconv_close(cd);
	}

	int Convert(char *pInBuf, size_t InLen, char *pOutBuf, size_t OutLen) 
	{
		memset(pOutBuf, 0, OutLen);
		
		return iconv(cd, &pInBuf, (size_t *)&InLen, &pOutBuf, (size_t *)&OutLen);
	}

	bool ISUTF8(unsigned char* pInBuf, int InLen)
	{
	    if (InLen <= 0)
			return false;
		int i = 0;
		int nBytes = 0;//UTF8可用1-6个字节编码,ASCII用一个字节
		unsigned char chr = 0;
		bool bAllAscii = true;//如果全部都是ASCII,说明不是UTF-8

		while (i < InLen)
		{
			chr = *(pInBuf + i);
			if ((chr & 0x80) != 0)
				bAllAscii = false;
			if (nBytes == 0)//计算字节数
			{
				if ((chr & 0x80) != 0)
				{
					while ((chr & 0x80) != 0)
					{
						chr <<= 1;
						nBytes++;
					}
					if (nBytes < 2 || nBytes > 6)
						return false;//第一个字节最少为110x xxxx
					nBytes--;//减去自身占的一个字节
				}
			}
			else//多字节除了第一个字节外剩下的字节
			{
				if ((chr & 0xc0) != 0x80)
					return false;//剩下的字节都是10xx xxxx的形式
				nBytes--;
			}
			++i;
		}
		if (bAllAscii)
			return false;
		return nBytes == 0;
	}
};


class CCodeConvertMgr
{
public:
	CCodeConvertMgr(void); 
	~CCodeConvertMgr(void); 

public:
	static void CodeConverterToUTF8( unsigned char *pInBuf, size_t InLen, unsigned char *pOutBuf, size_t OutLen);
	static void CodeConverterToGB2312( unsigned char *pInBuf, size_t InLen, unsigned char *pOutBuf, size_t OutLen);
	static void CodeConverterUnicodeToGB2312( unsigned char *pInBuf, size_t InLen, unsigned char *pOutBuf, size_t OutLen);
	static bool CodeConverterToUTF8String(char *pInBuf, size_t InLen, string &strOutBuf);
	static bool CodeConverterToGB2312String(char *pInBuf, size_t InLen, string &strOutBuf);

};

#endif


源文件:

////////////////////////////////////////////////////////////////////////////////
// 版权说明, 2010-2020, 
////////////////////////////////////////////////////////////////////////////////
// 文件名 :   CodeConvertMgr.cpp
// 作  者 :
// 版  本 :   1.0
// 日  期 :   2016-07-08
// 功能描述:  处理所有的转码
// 其他说明:  目前只处理UTF8 和GB2312的转码
//
// 修改历史:
// 日期(YYYY-MM-DD)     版本        修改人        修改内容
//       2016-07-08		  1.0		  宋小文 	    初始创建
////////////////////////////////////////////////////////////////////////////////
#include "CodeConvertMgr.h"

CCodeConvertMgr::CCodeConvertMgr()
{

}

CCodeConvertMgr::~CCodeConvertMgr()
{

}

/******************************************************************************
 * 函数介绍:将字符流转换为UTF8格式
 * 输入参数:
 *
 *
 * 输出参数: char[]
 * 返回值  : 无
 *****************************************************************************/
void CCodeConvertMgr::CodeConverterToUTF8( unsigned char *pInBuf, size_t InLen, unsigned char *pOutBuf, size_t OutLen)
{    
	memset(pOutBuf, 0, OutLen);
	CCodeConverter Cc("gb2312", "utf-8");
	if (Cc.ISUTF8(pInBuf, InLen) == false)
	{
	    Cc.Convert((char*)pInBuf, InLen, (char*)pOutBuf, OutLen); 
	}
	else
	{
	   memcpy(pOutBuf, pInBuf, InLen);
	}
}

/******************************************************************************
 * 函数介绍:将字符流转换为GB2312格式
 * 输入参数:
 *
 *
 * 输出参数: char[]
 * 返回值  : 无
 *****************************************************************************/
void CCodeConvertMgr::CodeConverterToGB2312( unsigned char *pInBuf, size_t InLen, unsigned char *pOutBuf, size_t OutLen)
{    
	memset(pOutBuf, 0, OutLen);
	CCodeConverter Cc("utf-8", "gb2312");
	if (Cc.ISUTF8(pInBuf, InLen) == true)
	{
	    Cc.Convert((char*)pInBuf, InLen, (char*)pOutBuf, OutLen); 
	}
	else
	{
	   memcpy(pOutBuf, pInBuf, InLen);
	}
}

/******************************************************************************
 * 函数介绍:将字符流转换为GB2312格式
 * 输入参数:
 *
 *
 * 输出参数: char[]
 * 返回值  : 无
 *****************************************************************************/
 void CCodeConvertMgr::CodeConverterUnicodeToGB2312( unsigned char *pInBuf, size_t InLen, unsigned char *pOutBuf, size_t OutLen)
{    
	memset(pOutBuf, 0, OutLen);
	CCodeConverter Cc("unicode", "gb2312");

	Cc.Convert((char*)pInBuf, InLen, (char*)pOutBuf, OutLen); 

}

/******************************************************************************
 * 函数介绍:将字符流转换为UTF8格式
 * 输入参数:
 *
 *
 * 输出参数: string
 * 返回值  : 无
 *****************************************************************************/
bool CCodeConvertMgr::CodeConverterToUTF8String(char *pInBuf, size_t InLen, string &strOutBuf)
{ 
	//首先清空输出,为后续赋值做准备
	strOutBuf = "";
	if((NULL == pInBuf) || (InLen <= 0))
	{
		printf("%s:error~~~~pInBuf is null len<%d> failed~~~~~~~~~\n", __FUNCTION__, (int)InLen);
		return false;
	}
	CCodeConverter Cc("gb2312", "utf-8");
	//如果是字符串是UTF8,不进行转码,直接赋值 到 strOutBuf
	if(Cc.ISUTF8((unsigned char*)pInBuf, InLen))
	{
		strOutBuf = pInBuf;
		return true;
	}
	//一般utf8 对应汉子是 3个字节 ; gb2312对应的汉子是2个字节; 
	//这里默认 utf8的长度是 gb2312长度的3倍
	size_t OutLen = InLen*3;
	char *pOutBuf = new char[OutLen];
	if(NULL == pOutBuf)
	{
		printf("%s:error~~~~pOutBuf new len<%d> failed~~~~~~~~~\n", __FUNCTION__, (int)OutLen);
		//new失败 直接赋值,避免造成有输入 无输出
		strOutBuf = pInBuf;
		return false;
	}
	//memset(pOutBuf, 0, OutLen);
    Cc.Convert(pInBuf, InLen, pOutBuf, OutLen); 
	strOutBuf = pOutBuf;
	//删除new的空间
	delete []pOutBuf; 
	pOutBuf = NULL;
	return true;
}

/******************************************************************************
 * 函数介绍:将字符流转换为GB2312格式
 * 输入参数:
 *
 *
 * 输出参数: string
 * 返回值  : 无
 *****************************************************************************/
bool CCodeConvertMgr::CodeConverterToGB2312String(char *pInBuf, size_t InLen, string &strOutBuf)
{   
	//首先清空输出,为后续赋值做准备
	strOutBuf = "";
	if((NULL == pInBuf) || (InLen <= 0))
	{
		printf("%s:error~~~~pInBuf is null len<%d> failed~~~~~~~~~\n", __FUNCTION__, (int)InLen);
		return false;
	}
	
	CCodeConverter Cc("utf-8", "gb2312");
	//默认不是UTF8 默认为GB2312 直接赋值
	if (Cc.ISUTF8((unsigned char*)pInBuf, InLen) == false)
	{
		strOutBuf = pInBuf;
		return true;
	}
	//一般utf8 对应汉子是 3个字节 ; gb2312对应的汉子是2个字节; 
	//这里默认 utf8的长度是 gb2312长度的3倍
	size_t OutLen = InLen*3;
	char *pOutBuf = new char[OutLen];
	if(NULL == pOutBuf)
	{
		printf("%s:error~~~~pOutBuf new len<%d> failed~~~~~~~~~\n", __FUNCTION__, (int)OutLen);
		//new失败 直接赋值,避免造成有输入 无输出
		strOutBuf = pInBuf;
		return false;
	}
	memset(pOutBuf, 0, OutLen);
    Cc.Convert(pInBuf, InLen, pOutBuf, OutLen); 
	strOutBuf = pOutBuf;
	//删除new的空间
	delete []pOutBuf; 
	pOutBuf = NULL;
	return true;
}





猜你喜欢

转载自blog.csdn.net/songxiao1988918/article/details/79025802