⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iniutil.cpp

📁 概述:数据的纵向收集
💻 CPP
字号:
#include "stdafx.h"
#include "IniUtil.h"
#include <wininet.h>			//INTERNET_MAX_PATH_LENGTH
#include <atlutil.h>			//Encode & CUrl

namespace NIniUtil
{
//////////////////////////////////////////////////////////////////////////
void DecodePureUTF(unsigned char *str, int nFlag)
{
	int nLen;
	u_char *pSrc;
	u_char *pDst;
	BOOL bIsPureUTF;
	char c1, c2, c3, cSave;
	char pszTemp[ 4 ];	// for only one multibyte
	int nMBLen;

	bIsPureUTF = TRUE;
	pSrc = (u_char *)str;
	nLen = (int)strlen((char*)str);
	
	//sunwangme,fixed,2007.3.29
	if(nLen==0)
		return;

	for (;;)
	{
		if (0xE0 == (*pSrc & 0xF0))	// UTF-8 three bytes
			pSrc += 3;
		else if (0xC0 == (*pSrc & 0xE0))	// UTF-8 double bytes
			pSrc += 2;
		else if (*pSrc < 0x80)
			pSrc++;
		else
		{
			bIsPureUTF = FALSE;
			break;
		}

		if (pSrc - str >= nLen)
			break;
	}

	if (!bIsPureUTF)	// 不是UTF-8
		return;

	pSrc = pDst = str;
	for (;;)
	{
		if (0xE0 == (*pSrc & 0xF0))	// UTF-8
		{
			c1 = *pSrc;
			c2 = *(pSrc + 1);
			c3 = *(pSrc + 2);

			*(pDst+1) = c1 << 4;
			cSave = c2;
			cSave >>= 2;
			*(pDst+1) |= cSave & 0x0F;
			*pDst = c2 << 6;
			*pDst |= c3 & 0x3F;

			if (!(KEEP_UNICODE & nFlag))	//
			{
				if (DECODE_BIG5 & nFlag)
					nMBLen = WideCharToMultiByte(950, 0, (LPCWSTR)pDst, 1, pszTemp, sizeof(pszTemp), "", NULL);
				else
					nMBLen = WideCharToMultiByte(936, 0, (LPCWSTR)pDst, 1, pszTemp, sizeof(pszTemp), "", NULL);

				memcpy( pDst, pszTemp, nMBLen );
				pDst += nMBLen;
			}
			else
				pDst += 2;

			pSrc += 3;
		}
        else if (0xC0 == (*pSrc & 0xE0))	// UTF-8 double bytes
		{
            u_char hello[2];
			c1 = *pSrc;
			c2 = *(pSrc + 1);

            
            *(hello+0) = ((c1 << 6) & 0xC0) | (c2 & 0x3F);     // get last 6 bit
			*(hello+1) = 0;

			if (!(KEEP_UNICODE & nFlag))	//
			{
				if (DECODE_BIG5 & nFlag)
					nMBLen = WideCharToMultiByte(950, 0, (LPCWSTR)hello, 1, pszTemp, sizeof(pszTemp), "", NULL);
				else
					nMBLen = WideCharToMultiByte(936, 0, (LPCWSTR)hello, 1, pszTemp, sizeof(pszTemp), "", NULL);

				memcpy( pDst, pszTemp, nMBLen );
				pDst += nMBLen;
			}
			else
				pDst += 1;

			pSrc += 2;
		}
		else if (*pSrc < 0x80)
		{
			*pDst++ = *pSrc++;
		}

		if (pSrc - str >= nLen)
		{
			*pDst = '\0';
			break;
		}
	}
}

/*sunwang,2006-5-12
1.取词的问题
现在我们取到的词有两种,一种是网页上get过来的,是form编码的系统字符集的词;也可能是我们自己造的UTF8字符集然后form编码的东西。
Keyword=Form(GetSystemDefaultLCID())
||
keyword=Form(UTF-8<--Unicode<--GetSystemDefaultLCID()),如果GetSystemDefaultLCID发现是多字节字符集如2052 
||
kwyword=From(UTF-8<--GetSystemDefaultLCID()),如果发现是单字符集就这样了如1033

2.造词的问题
不需要utf8的,直接form
需要utf8的,首先unicode,然后utf-8,然后form

*/

/*
 sunwang,2007.3.26
 对于encodeURIcomponent和encodeURI都是utf-8+form编码,解码也一样,奶奶的
*/
static WORD __GetSystemLangID()
{
	LCID lcidLanguage = ::GetSystemDefaultLCID();
	WORD idLangID = LANGIDFROMLCID(lcidLanguage);
	return idLangID;
}


//936--简体中文
//950--繁体中文
//0--英文
static UINT __GetSystemCodePage()
{
	LCID lcidLanguage = ::GetSystemDefaultLCID();
	WORD idLangID = LANGIDFROMLCID(lcidLanguage);
	if (idLangID==MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED))
	{
		return 936;
	}
	else if (idLangID==MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US))
	{
		return 950;
	}
	else
	{
		return 0;
	}
}

static int __XXXToWide(LPCSTR szSrc,int nSrc,LPWSTR wszOut,int nOut)
{
	UINT iPageCode=__GetSystemCodePage();
	return MultiByteToWideChar(iPageCode,0,szSrc,nSrc,wszOut,nOut);
}

static int __WideToUtf8(LPCWSTR wszSrc,int nSrc,LPSTR szOut,int nOut)
{
	return AtlUnicodeToUTF8(wszSrc,nSrc,szOut,nOut);
}

BOOL EncodeSearchKeyword(LPCTSTR lpKeyword, CString& strOutword, BOOL bUTF8)
{
	strOutword.Empty();

	if(lpKeyword)
	{
		//xxx-->unicode-->utf8-->formencode
		if(bUTF8)
		{
			CHAR szBuffer[INTERNET_MAX_PATH_LENGTH];
			WCHAR wszBuffer[INTERNET_MAX_PATH_LENGTH];
			DWORD dwLen,dwLenWide;
			CString sUtf8;

			//xxx-->unicode
			wszBuffer[0]=0;
			ZeroMemory(wszBuffer,INTERNET_MAX_PATH_LENGTH*sizeof(WCHAR));
			if((dwLenWide=__XXXToWide(lpKeyword,lstrlen(lpKeyword),wszBuffer,INTERNET_MAX_PATH_LENGTH))==0)
				return FALSE;

			//unicode-->utf-8
			szBuffer[0]=0;
			ZeroMemory(szBuffer,INTERNET_MAX_PATH_LENGTH*sizeof(CHAR));
			if((dwLen=__WideToUtf8(wszBuffer,dwLenWide,szBuffer,INTERNET_MAX_PATH_LENGTH))==0)
				return FALSE;
			sUtf8=szBuffer;

			//utf-8-->formcode
			dwLen = 0;
			ZeroMemory(szBuffer,INTERNET_MAX_PATH_LENGTH*sizeof(CHAR));
			if( AtlEscapeUrl(T2CA(sUtf8), szBuffer, &dwLen, INTERNET_MAX_PATH_LENGTH) )
			{
				strOutword = szBuffer;
				return TRUE;
			}
		}
		else
		{
			CHAR szBuffer[INTERNET_MAX_PATH_LENGTH];
			DWORD dwLen = 0;
			if( AtlEscapeUrl(T2CA(lpKeyword), szBuffer, &dwLen, INTERNET_MAX_PATH_LENGTH) )
			{
				strOutword = szBuffer;
				return TRUE;
			}
		}
	}

	return FALSE;
}

// 规范化搜索词
BOOL DecodeSearchKeyword(LPCTSTR lpSearchWord, CString& strOutWord)
{
	USES_CONVERSION;

	CHAR szBuffer1[INTERNET_MAX_PATH_LENGTH];
	DWORD dwLen = 0;

	strOutWord.Empty();
	if( AtlUnescapeUrl(T2CA(lpSearchWord), szBuffer1, &dwLen, INTERNET_MAX_PATH_LENGTH) )
	{
		// UTF8
		DecodePureUTF((unsigned char*)szBuffer1, DECODE_UNICODE);
		strOutWord = szBuffer1;
		return TRUE;

		//dwLen = 0;
		//if( AtlEscapeUrl(szBuffer1, szBuffer2, &dwLen, INTERNET_MAX_PATH_LENGTH, 0) )
		//{
		//	strOutWord = szBuffer2;
		//	return TRUE;
		//}
	}

	return FALSE;
}

// 拆分字符串:分隔中间如果为空,不会被建立
// 如 |a||||b|c 只会被拆成三个:a/b/c
BOOL SplitString(LPCTSTR lpString, CSimpleArray<CString>& arr, LPCTSTR lpTokens/*=NULL*/)
{
	if(lpTokens == NULL)
		lpTokens = "|";

	arr.RemoveAll();

	CString szString = lpString;
	CString szTemp;
	int curPos  = 0;

	szTemp = szString.Tokenize(lpTokens, curPos);
	while (! szTemp.IsEmpty())
	{
		arr.Add(szTemp);
		szTemp = szString.Tokenize(lpTokens, curPos);
	}

	return (arr.GetSize() > 0);
}

// 拆分字符串:分隔符中间为空,建立空的项
// 如 |a||||b|c 只会被拆成6个:a/ / / /b/c
// 与_SplitString一样,最左边和最右边的分隔符不会对结果有影响(有或没有都可以)
BOOL SplitStringEx(LPCTSTR lpString, CSimpleArray<CString>& arr, TCHAR chToken/*=NULL*/)
{
	if(chToken == 0)
		chToken = '|';

	arr.RemoveAll();

	CString szString = lpString;
	if(szString.IsEmpty())
		return FALSE;

	int nStart = 0;
	int nOffset;

	while(1)
	{
		nOffset = szString.Find(chToken, nStart);

		if(nOffset > 0)
		{
			arr.Add(szString.Mid(nStart, nOffset-nStart));
		}
		else if(nOffset == -1L)
		{
			if(nStart != szString.GetLength())
			{
				arr.Add(szString.Mid(nStart));
			}

			break;
		}

		nStart = nOffset + 1;
	};

	return TRUE;
}

BOOL CombinationStringArray(CSimpleArray<CString>& arrString, CString& szCombin, LPCTSTR lpSpace)
{
	szCombin.Empty();
	for(int i=0; i<arrString.GetSize(); ++i)
	{
		if(lpSpace && ! szCombin.IsEmpty())
			szCombin += lpSpace;

		szCombin += arrString[i];
	}

	return TRUE;
}
//////////////////////////////////////////////////////////////////////////

void GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, CString& strReturn, LPCTSTR lpConfigFile)
{
	DWORD dwSize = 1024;
	LPTSTR lpBuffer = new TCHAR[dwSize];

	while(lpBuffer)
	{
		DWORD dwRet = ::GetPrivateProfileString(lpAppName, lpKeyName, lpDefault, lpBuffer, dwSize, lpConfigFile);

		// 可能缓冲区不足
		if(dwRet == dwSize - 1)
		{
			delete []lpBuffer;

			// 放大一倍缓冲区
			dwSize *= 2;
			lpBuffer = new TCHAR[dwSize];
		}
		else
		{
			break;
		}
	}

	if(lpBuffer)
	{
		strReturn = lpBuffer;

		delete []lpBuffer;
		return;
	}

	strReturn = lpDefault;
}

//是否文件存在
BOOL FileExist( PCHAR lpSource )
{
	int nRet = FALSE;

	WIN32_FIND_DATA fd;
	memset( &fd, 0, sizeof(WIN32_FIND_DATA) );

	HANDLE hFile = FindFirstFile( lpSource, &fd );

	// 文件不存在
	if( hFile == INVALID_HANDLE_VALUE )
		return FALSE;

	// 检查文件还是文件夹
	if( fd.cFileName[0] != '.' && fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
		nRet = FALSE;	// 文件夹
	else
		nRet = TRUE;			// 文件

	FindClose(hFile);
	return nRet;
}

BOOL ForceCreateDir(LPCSTR FullPath)
{
	char dir[MAX_PATH], *pos;

	pos = (CHAR*)FullPath;
	while(*pos)
	{
		if ((pos=strchr(pos, '\\')) == NULL) return TRUE;
		memset(dir,0,MAX_PATH);
		strncpy(dir, FullPath, pos-FullPath);

		if(FALSE == CreateDirectory(dir, NULL))
		{
			//DWORD dwResult = GetLastError();
			//if(ERROR_ALREADY_EXISTS != dwResult)
			//	return FALSE;
		}
		pos++;
		while(*pos=='\\')
			pos++;
	}
	return TRUE;
}
//////////////////////////////////////////////////////////////////////////
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -