字符集编码转换--MFC

来源:互联网 发布:电梯网络远程视频监控 编辑:程序博客网 时间:2024/05/16 06:22

字符编码转换,在MFC下使用没问题

XzmBaseFuncLib.h 

#pragma onceclass CXzmBaseFuncLib{public:CXzmBaseFuncLib(){}~CXzmBaseFuncLib(){}/** * @brief 将给定的GBK字符串转换为UTF-8编码 * * * @param pSrc  * @param pDst  */static int CharToUtf8(const char* pSrc, char** pDst) throw();/** * @brief 将给定的Utf8字符串转换为Char编码 * * * @param pSrc  * @param pDst  */static int Utf8ToChar(LPCSTR pSrc, char** pDst);/** * @brief 将给定的UNICODE字符串转换为Char编码 * * * @param strSrc  * @param pDst  */static int Us2ToChar(const CString& strSrc, char** pDst,int nCodePage = CP_ACP);/** * @brief 将给定的GBK字符串转换为UNICODE编码 * * * @param szSrc  * @param pDst  */static int CharToUS2(const char* szSrc, WCHAR** pDst,int nCodePage = CP_ACP);/** * @brief 将给定的UNICODE字符串转换为UTF-8编码 * * * @param strSrc  * @param pDst  */static int US2ToUtf8(const CString& strSrc,char** pDst) throw();/** * @brief 将给定的Utf8字符串转换为UNICODE编码 * * * @param pSrc  * @param pDst  */static int Utf8ToUS2(LPCSTR pSrc, WCHAR** pDst) throw();/** * @brief GBK编码转换为简体中文 * * * @param strSrc  * @return  */static CString GBKToGB2312(const CString &strSrc);/** * @brief 简体中文转换为GBK编码 * * * @param strSrc  * @return  */static CString GB2312ToGBK(const CString &strSrc);/** * @brief 转换文字 * * * @param strSrc  * @return  */static CString PercentStringDecode(const CString& strSrc,BOOL bUtf8 = FALSE);/** * @brief  * * * @param &x  * @return  */static BYTE toHex(const BYTE &x);/** * @brief 将数字转换为字符串 * * * @param i  * @return  */static CString NumToStr(LONGLONG i);/** * @brief 字符串转换到数字 * * * @param strTemp  * @return  */static DWORD StrToNum(const CString& strTemp);/** * @brief 字符串转换到数字,支持超大数字 * * * @param strTemp  * @return  */static void StrToNum2(const CString& strTemp,DWORD &dwNum1,DWORD &dwNum2);/** * @brief 字节流转换到字符串 * * * @param szSrc 字节流源 * @param nLen 字节流长度 * @param szDest 目标字符串 * @return  */static void ChangeToChar(byte *szSrc,int nLen,char *szDest);/** * @brief 判断路径释放存在 * * * @param strPath  * @return  */static BOOL IsPathExist(const CString& strPath) throw();};


XzmBaseFuncLib.cpp

#include "stdafx.h"#include "BaseFuncLib.h"int CXzmBaseFuncLib::CharToUtf8(const char* pSrc, char** pDst) throw(){char* cUTF8=NULL;WCHAR* wchar=NULL;int iLength=0;iLength=MultiByteToWideChar(CP_ACP,0,pSrc,-1,NULL,0);if(!iLength)return iLength;iLength++;wchar=new WCHAR[iLength];if(wchar==NULL)return 0;::memset(wchar,0,iLength*sizeof(WCHAR));::MultiByteToWideChar(CP_ACP,0,pSrc,-1,wchar,iLength-1);iLength=::WideCharToMultiByte(CP_UTF8,0,wchar,-1,NULL,0,NULL,NULL);if(!iLength){delete []wchar;wchar=NULL;return iLength;}iLength++;cUTF8=new char[iLength];if(cUTF8!=NULL){::memset(cUTF8,0,iLength*sizeof(char));iLength=::WideCharToMultiByte(CP_UTF8,0,wchar,-1,cUTF8,iLength-1,NULL,NULL);*pDst = cUTF8;}elseiLength = 0;delete []wchar;wchar=NULL;return iLength;}int CXzmBaseFuncLib::Utf8ToChar(LPCSTR pSrc, char** pDst){WCHAR*  strW=NULL;int iLength=0;iLength=::MultiByteToWideChar(CP_UTF8,0,pSrc,-1,NULL,0);if(!iLength)return iLength;iLength++;strW = new WCHAR[iLength];if(strW==NULL)return 0;::memset(strW,0,iLength*sizeof(WCHAR));::MultiByteToWideChar(CP_UTF8,0,pSrc,-1,strW,iLength-1);iLength=::WideCharToMultiByte(CP_ACP,0,strW,-1,NULL,0,NULL,NULL);if(!iLength){delete []strW;strW=NULL;return 0;}iLength++;char *strA=NULL;strA=new char[iLength];if(strA!=NULL){::memset(strA,0,iLength*sizeof(char));iLength = ::WideCharToMultiByte(CP_ACP,0,strW,-1,strA,iLength-1,NULL,NULL);*pDst=strA;}elseiLength = 0;delete []strW;strW=NULL;return iLength;}int CXzmBaseFuncLib::Us2ToChar(const CString& strSrc, char** pDst,int nCodePage /*= CP_ACP*/){int iLength=::WideCharToMultiByte(nCodePage,0,strSrc,-1,NULL,0,NULL,NULL);if(!iLength)return iLength;iLength++;char *strA=NULL;strA= new char[iLength];if(strA==NULL)return 0;::memset(strA,0,iLength*sizeof(char));int iLength1 = 0;if(nCodePage)iLength1 = ::WideCharToMultiByte(nCodePage,WC_COMPOSITECHECK,strSrc,-1,strA,iLength-1,NULL,NULL);elseiLength1 = ::WideCharToMultiByte(nCodePage,0,strSrc,-1,strA,iLength-1,NULL,NULL);*pDst=strA;return iLength1;}int CXzmBaseFuncLib::CharToUS2(const char* szSrc, WCHAR** pDst,int nCodePage /*= CP_ACP*/){WCHAR* strW=NULL;int iLength=0;iLength=MultiByteToWideChar(nCodePage,0,szSrc,-1,NULL,0);if(!iLength)return iLength;iLength++;strW=new WCHAR[iLength];if(strW==NULL)return 0;::memset(strW,0,iLength*sizeof(WCHAR));int iLength1 = 0;if(nCodePage)iLength1 = ::MultiByteToWideChar(nCodePage,MB_COMPOSITE,szSrc,-1,strW,iLength-1);elseiLength1 = ::MultiByteToWideChar(nCodePage,0,szSrc,-1,strW,iLength-1);*pDst=strW;return iLength1;}int CXzmBaseFuncLib::US2ToUtf8(const CString& strSrc,char** pDst) throw(){char* cUTF8=NULL;int iLength=0;iLength=::WideCharToMultiByte(CP_UTF8,0,strSrc,-1,NULL,0,NULL,NULL);if(!iLength)return iLength;iLength++;ATLTRY(cUTF8=new char[iLength]);if(cUTF8!=NULL){::memset(cUTF8,0,iLength*sizeof(char));iLength=::WideCharToMultiByte(CP_UTF8,0,strSrc,-1,cUTF8,iLength-1,NULL,NULL);*pDst = cUTF8;}elseiLength = 0;return iLength;}int CXzmBaseFuncLib::Utf8ToUS2(LPCSTR pSrc, WCHAR** pDst) throw(){WCHAR *strW = NULL;int iLength = ::MultiByteToWideChar(CP_UTF8,0,pSrc,-1,NULL,0);if(!iLength)return 0;iLength++;ATLTRY(strW = new WCHAR[iLength]);if(NULL == strW)return 0;::memset(strW,0,iLength*sizeof(WCHAR));int iLength1=::MultiByteToWideChar(CP_UTF8,0,pSrc,-1,strW,iLength-1);*pDst=strW;return iLength1;}CString CXzmBaseFuncLib::GBKToGB2312(const CString &strSrc){DWORD dwErrCode = 0;CString strDest(_T(""));DWORD wLanguageID = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_BIG5);int nLen = ::LCMapString(wLanguageID,LCMAP_SIMPLIFIED_CHINESE,strSrc,-1,NULL,0);WCHAR *szDest = NULL;if(nLen){nLen++;szDest = new WCHAR[nLen];}elsedwErrCode = ::GetLastError();if(NULL == szDest)return strDest;memset(szDest,0,sizeof(WCHAR)*nLen);nLen = ::LCMapString(wLanguageID,LCMAP_SIMPLIFIED_CHINESE,strSrc,-1,szDest,nLen); if(NULL != szDest){strDest = szDest;delete []szDest;szDest = NULL;}return strDest;}CString CXzmBaseFuncLib::GB2312ToGBK(const CString &strSrc){DWORD dwErrCode = 0;CString strDest(_T(""));DWORD wLanguageID = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);int nLen = ::LCMapString(wLanguageID,LCMAP_TRADITIONAL_CHINESE,strSrc,-1,NULL,0);WCHAR *szDest = NULL;if(nLen){nLen++;szDest = new WCHAR[nLen];}elsedwErrCode = ::GetLastError();if(NULL == szDest)return strDest;memset(szDest,0,sizeof(WCHAR)*nLen);nLen = ::LCMapString(wLanguageID,LCMAP_TRADITIONAL_CHINESE,strSrc,-1,szDest,nLen); if(NULL != szDest){strDest = szDest;delete []szDest;szDest = NULL;}return strDest;}CString CXzmBaseFuncLib::PercentStringDecode(const CString& strSrc,BOOL bUtf8 /*= FALSE*/){char *szBuf = NULL;char cTem[8192] = {};int nLen = strSrc.GetLength(),nC = 0;for(int nIndex = 0;nIndex < nLen;){CString strVal(_T(""));WCHAR wc = strSrc.GetAt(nIndex);if(wc != _T('%')){cTem[nC] = (char)wc;nC++;nIndex++;continue;}nIndex++;if(nIndex < nLen){strVal += strSrc.GetAt(nIndex);nIndex++;}if(nIndex < nLen){strVal += strSrc.GetAt(nIndex);nIndex++;}CXzmBaseFuncLib::Us2ToChar(strVal,&szBuf);cTem[nC] = (char )strtoul(szBuf, NULL, 16);nC++;delete []szBuf;szBuf = NULL;if(nC >= 8192)break;}if(bUtf8){CXzmBaseFuncLib::Utf8ToChar(cTem,&szBuf);CString strReturn(szBuf);delete []szBuf;szBuf = NULL;return strReturn;}else{CString strReturn(cTem);return strReturn;}}BYTE CXzmBaseFuncLib::toHex(const BYTE &x){return x > 9 ? x + 55: x + 48;}CString CXzmBaseFuncLib::NumToStr(LONGLONG i){CString strTemp(_T(""));if (i == 0){strTemp = _T("0");return strTemp;}LONGLONG dwNumber = i;while (dwNumber){TCHAR Temp = (TCHAR)(dwNumber % 10 + '0');strTemp.Insert(0,Temp);dwNumber = dwNumber / 10;}return strTemp;}DWORD CXzmBaseFuncLib::StrToNum(const CString& strTemp){DWORD dwValue = 0;if(strTemp.IsEmpty())return dwValue;for (int j = 0; j < strTemp.GetLength(); j++){TCHAR c = strTemp[j];if (c <= '9' && c >= '0'){dwValue *= 10;dwValue = (dwValue + (c - '0')) ; }}return dwValue;}void CXzmBaseFuncLib::StrToNum2(const CString& strTemp,DWORD &dwNum1,DWORD &dwNum2){dwNum1 =0;dwNum2 =0;if(strTemp.IsEmpty())return;DWORD dwValue = 0;intj=0,nLen = strTemp.GetLength();for (j = 0; j < nLen; j++){TCHAR c = strTemp[j];if (c <= '9' && c >= '0'){dwValue *= 10;dwValue = (dwValue + (c - '0')) ; }if(nLen-8 == j){dwNum1 = dwValue;dwValue = 0;}}if(dwValue)dwNum2 = dwValue;}void CXzmBaseFuncLib::ChangeToChar(byte *szSrc,int nLen,char *szDest){if(NULL == szSrc || NULL == szDest)return;char tmp[4];for(int nIndex = 0;nIndex<nLen;nIndex++){memset(tmp,0,4);_itoa_s(szSrc[nIndex],tmp,4,16);if(strlen(tmp)<2)strcat_s(szDest,MAX_PATH,"0");strcat_s(szDest,MAX_PATH,tmp);}}BOOL CXzmBaseFuncLib::IsPathExist(const CString& strPath) throw(){BOOL bRet = FALSE;if(strPath.IsEmpty())return bRet;WIN32_FIND_DATAdata;BOOL bFindDir = FALSE;CString strFind(strPath);if (0 == strPath.Right(1).CompareNoCase( _T("\\"))){/// 查找目录bFindDir = TRUE;strFind+=_T("*.*");}/** * @brief             FindFirstFile() * * @Function           * * @param[  _In_   ]   * * @param[  _Out_  ]   * * @param[_Out_opt_]   * * @return            如果函数成功,则得到一个句柄,否则失败将得到值INVALID_HANDLE_VALUE * * @Date xzm_@_2017/06/30  13:40:11*/HANDLE hFindFile = ::FindFirstFile(strFind,&data);if(INVALID_HANDLE_VALUE != hFindFile){if(bFindDir){while(INVALID_HANDLE_VALUE != hFindFile){if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY ){bRet = TRUE;break;}/** * @brief             FindNextFile * * @Function           * * @param[  _In_   ]   * * @param[  _Out_  ]   * * @param[_Out_opt_]   * * @return            如果函数成功,则返回值不为零,lpFindFileData 参数包含有关找到的下一个文件或目录的信息。 *                    如果函数失败,则返回值为零,并且lpFindFileData的内容 是不确定的。要获取扩展错误信息,请调用 GetLastError函数。 * * @Date xzm_@_2017/06/30  13:40:11*/if (!FindNextFile(hFindFile,&data))break;}}elsebRet = TRUE;::FindClose(hFindFile);hFindFile = NULL;}elsebRet=FALSE;return bRet;}


原创粉丝点击