gb2312 utf-8判断及转换

//.h

#ifdef WIN32
 /************************************************************************
 * Name : ASCII2UTF8()
 * Desc : 将acii字符串转换为utf8格式; 返回转换后的长度
 ************************************************************************/
 static int ASCII2UTF8(
  const char* szBuf     //原字符串缓冲区
  , std::string& szDest    //目标字符串
  );

 /************************************************************************
 * Name : UTF82ACII()
 * Desc : UTF8格式转换为ASCII格式字符串
 ************************************************************************/
 static int UTF82ASCII(
  const char* szUtf8Data   //原字符串缓冲区
  , std::string& szDest   //目标字符串
  );

 //-------------------------------------------------------
 // 判断是否Utf8
 //-------------------------------------------------------
 static bool IsUTF8( const char * pzInfo );

 //-------------------------------------------------------
 // 判断是否gb2312
 //-------------------------------------------------------
 static bool IsGB2312( const char *pzInfo );
#endif

 //-------------------------------------------------------
 // 是否gb2312
 //-------------------------------------------------------
 static int IsGB( char *pText );

 //-------------------------------------------------------
 // 是否有中文
 //-------------------------------------------------------
 static bool IsChinese( const char *pzInfo );
 

//.cpp

#ifdef WIN32
/***************************************************
* Function:       ASCII2UTF8
* Description:    Ascii转换为uft-8
* Input:          szBuf:原字符串缓冲区
                  szDest:utf-8目标
* Output:        
* Return:        
* Others:        
***************************************************/
int CGTDBSVRLib::ASCII2UTF8(
      const char* szBuf     //原字符串缓冲区
      , std::string& szDest
      )
{
 int nLen = 0;
#define W_LEN 1024
#define BUF_MAX (W_LEN *4)

 try
 {
  WCHAR wChar[W_LEN] = { 0 };
  char szDestData[BUF_MAX] = { 0 };

  MultiByteToWideChar(CP_ACP, 0, szBuf, -1, wChar, sizeof(wChar)/sizeof(wChar[0]));
  nLen = WideCharToMultiByte(CP_UTF8, 0, wChar, -1, szDestData, sizeof(szDestData), NULL, NULL);
  szDest = szDestData;

#ifdef _DEBUG_TEST
  char szBuf[BUF_MAX] = { 0 };
  MultiByteToWideChar(CP_UTF8, 0, szUtf8Data, nLen +1, wChar, sizeof(wChar)/sizeof(wChar[0]));
  nLen = WideCharToMultiByte(CP_ACP, 0, wChar, -1, szBuf, sizeof(szBuf), NULL, NULL);
  GT_TRACE(e_Debug, "/r/nsizeof(wChar) = %ld", sizeof(wChar));
#endif
 }
 catch (long nLine)
 {
  //  GT_TRACE(e_Debug, "/r/n 代码异常%s: LINE = %ld/n", __FILE__, nLine);
 }
 catch (...)
 {
 }

 return nLen;
}

/***************************************************
* Function:       UTF82ASCII
* Description:    utf-8转换为Ascii
* Input:          szUtf8Data:原字符串缓冲区
                  szDest:Ascii目标字符
* Output:        
* Return:        
* Others:        
***************************************************/
int CGTDBSVRLib::UTF82ASCII(
      const char* szUtf8Data   //原字符串缓冲区
      , std::string& szDest
      )
{
 int nLen = 0;
#define W_LEN 1024
#define BUF_MAX (W_LEN *4)

 WCHAR wChar[W_LEN] = { 0 };
 char szDestData[BUF_MAX] = { 0 };

 MultiByteToWideChar(CP_UTF8, 0, szUtf8Data, -1, wChar, sizeof(wChar)/sizeof(wChar[0]));
 nLen = WideCharToMultiByte(CP_ACP , 0, wChar, -1, szDestData, sizeof(szDestData), NULL, NULL);

 szDest = szDestData;
 return nLen;
}

/***************************************************
* Function:       IsUTF8
* Description:    判断是否utf-8编码字符
* Input:          pzInfo:要判断的字符
* Output:        
* Return:        
* Others:        
***************************************************/
bool CGTDBSVRLib::IsUTF8( const char * pzInfo )
{
 int nWSize = MultiByteToWideChar( CP_UTF8,MB_ERR_INVALID_CHARS,pzInfo,-1,NULL,0 );
 int error = GetLastError();
 if (error == ERROR_NO_UNICODE_TRANSLATION)
 {
  return false;
 }
 //判断是否是gb2312,只要把CP_UTF8用936代替即可.

 return true;
}

/***************************************************
* Function:       IsGB2312
* Description:    判断是否gb2312编码字符
* Input:          pzInfo:待判断字符
* Output:        
* Return:        
* Others:        
***************************************************/
bool CGTDBSVRLib::IsGB2312( const char *pzInfo )
{
 int nWSize = MultiByteToWideChar( 936,MB_ERR_INVALID_CHARS,pzInfo,-1,NULL,0 );
 int error = GetLastError();
 if (error == ERROR_NO_UNICODE_TRANSLATION)
 {
  return false;
 }
 //判断是否是CP_UTF8,只要把936用CP_UTF8代替即可.

 return true;
}

#endif

/***************************************************
* Function:       IsGB
* Description:    是否gb2312
* Input:          pText:待判断字符
* Output:        
* Return:        
* Others:        
***************************************************/
int CGTDBSVRLib::IsGB( char *pText )
{
 unsigned char *sqChar = (unsigned char *)pText;
 if (sqChar[0] >= 0xa1)
 {
  if (sqChar[0] == 0xa3)
  {
   return 1;//全角字符
  }
  else
  {
   return 2;//汉字
  }
 }
 else
 {
  return 0;//英文、数字、英文标点
 }
}


/***************************************************
* Function:       IsChinese
* Description:    是否有中文
* Input:          pzInfo:待判断字符
* Output:        
* Return:        
* Others:        
***************************************************/
bool CGTDBSVRLib::IsChinese( const char *pzInfo )
{
 int i;
 char *pText = (char*)pzInfo;
 while (*pText != '/0')
 {
  i = IsGB(pText);
  switch(i)
  {
  case 0:
   pText++;
   break;
  case 1:
   pText++;
   pText++;
   break;
  case 2:
   pText++;
   pText++;
   return TRUE;
   break;
  }
 }

 return false;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值