📄 iniutil.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 + -