//.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;
}