视频安防监控平台-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;
}