📄 iniutil.cpp
字号:
#include "stdafx.h"
#include "IniUtil.h"
#include <wininet.h> //INTERNET_MAX_PATH_LENGTH
#include <atlutil.h> //Encode & CUrl
#include <winnls.h>
namespace NIniUtil
{
//////////////////////////////////////////////////////////////////////////
#define DECODE_UNICODE 0
#define KEEP_UNICODE 1
#define DECODE_GBK 0
#define DECODE_BIG5 2
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);
for (;;)
{
if (0xE0 == (*pSrc & 0xF0)) // UTF-8
pSrc += 3;
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 (*pSrc < 0x80)
{
*pDst++ = *pSrc++;
}
if (pSrc - str >= nLen)
{
*pDst = '\0';
break;
}
}
}
// 拆分字符串:分隔中间如果为空,不会被建立
// 如 |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 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_GBK);
strOutWord = szBuffer1;
return TRUE;
}
return FALSE;
}
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;
}
//////////////////////////////////////////////////////////////////////////
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -