Util.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925
  1. // Util.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "Util.h"
  5. #include <odbcinst.h>
  6. #include <comdef.h>
  7. #include <afxdb.h>
  8. #include <regex>
  9. typedef basic_string<char>::size_type S_T;
  10. wstring strA2W(const string &str)
  11. {
  12. int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
  13. wchar_t *wstr = new wchar_t[len + 2];
  14. memset(wstr, 0, (2 + len)*sizeof(wchar_t));
  15. MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wstr, len);
  16. wstring cstrDestW = wstr;
  17. delete[] wstr;
  18. return cstrDestW;
  19. }
  20. string strW2A(const wstring &wstr)
  21. {
  22. int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
  23. char *str = new char[len + 2];
  24. memset(str, 0, len + 2);
  25. WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, str, len, NULL, NULL);
  26. string cstrDestA = str;
  27. delete[] str;
  28. return cstrDestA;
  29. }
  30. string strWtoUTF8(const wstring &src)
  31. {
  32. string result="";
  33. int n = WideCharToMultiByte( CP_UTF8, 0, src.c_str(), -1, 0, 0, 0, 0 );
  34. result.resize(n);
  35. ::WideCharToMultiByte( CP_UTF8, 0, src.c_str(), -1, (char*)result.c_str(), result.length(), 0, 0 );
  36. return result;
  37. }
  38. wstring strUTF8toW(const string& src)
  39. {
  40. wstring result=L"";
  41. int n = MultiByteToWideChar( CP_UTF8, 0, src.c_str(), -1, NULL, 0 ) + 1 ;
  42. result.resize(n + 1);
  43. ::MultiByteToWideChar( CP_UTF8, 0, src.c_str(), -1, (LPWSTR)result.c_str(), result.length());
  44. result[n] = L'\0';
  45. return result;
  46. }
  47. bool IsLeap(int year)
  48. {
  49. if((year%4==0&&year%100!=0)||year%400==0)
  50. return true;
  51. else
  52. return false;
  53. }
  54. bool IsWeekEnd(int year, int month, int day)
  55. {
  56. struct tm stTime = {0};
  57. struct tm *ptr = NULL;
  58. time_t time;
  59. stTime.tm_year = year - 1900;
  60. stTime.tm_mon = month - 1;
  61. stTime.tm_mday = day;
  62. time = mktime(&stTime);
  63. ptr = localtime(&time);
  64. return (ptr->tm_wday == 0 || ptr->tm_wday == 6);
  65. }
  66. char* PBQ_TrimLeftA(char *pTarget)
  67. {
  68. char buf[] = " \t";
  69. return PBQ_TrimLeftMA(pTarget, buf);
  70. }
  71. char* PBQ_TrimRightA(char *pTarget)
  72. {
  73. char buf[] = " \t";
  74. return PBQ_TrimRightMA(pTarget, buf);
  75. }
  76. char* PBQ_TrimLeftMA(char *pTarget, char* pChars)
  77. {
  78. char *ptr = pTarget;
  79. if(pTarget != NULL && pChars != NULL)
  80. {
  81. for (; ptr != NULL && *ptr != '\0'; ptr++)
  82. {
  83. if(NULL == strchr(pChars, *ptr))
  84. {
  85. break;
  86. }
  87. }
  88. strcpy(pTarget, ptr);
  89. }
  90. return pTarget;
  91. }
  92. char* PBQ_TrimRightMA(char *pTarget, char* pChars)
  93. {
  94. char *pEnd = NULL;
  95. if (pTarget != NULL)
  96. {
  97. pEnd = pTarget + strlen(pTarget) - 1;
  98. for (; pEnd >= pTarget; pEnd--)
  99. {
  100. if(NULL != strchr(pChars, *pEnd))
  101. {
  102. *pEnd = 0;
  103. }
  104. else
  105. {
  106. break;
  107. }
  108. }
  109. }
  110. return pTarget;
  111. }
  112. void Full2Half(wchar_t* str)
  113. {
  114. if(str != NULL)
  115. {
  116. int len = wcslen(str);
  117. int i = 0;
  118. wchar_t space[] = L" ";
  119. for(; i<len; i++)
  120. {
  121. if(str[i] == space[0])//对空格特殊处理
  122. {
  123. str[i] = ' ';
  124. }
  125. else if(str[i] >= 65281 && str[i] <= 65374)
  126. {
  127. str[i] -= (65281 - 33);
  128. }
  129. }
  130. }
  131. }
  132. vector<string> splitEx(const string& src, string separate_character)
  133. {
  134. vector<string> strs;
  135. int separate_characterLen = separate_character.size();//分割字符串的长度,这样就可以支持如“,,”多字符串的分隔符
  136. int lastPosition = 0, index = -1;
  137. while (-1 != (index = src.find(separate_character, lastPosition)))
  138. {
  139. strs.push_back(src.substr(lastPosition, index - lastPosition));
  140. lastPosition = index + separate_characterLen;
  141. }
  142. string lastString = src.substr(lastPosition);//截取最后一个分隔符后的内容
  143. if (!lastString.empty())
  144. strs.push_back(lastString);//如果最后一个分隔符后还有内容就入队
  145. return strs;
  146. }
  147. int GB2312_2_UTF8(char* buf, int buf_len, const char* src, int src_len)
  148. {
  149. int i = 0, j = 0;
  150. if (0 == src_len)
  151. {
  152. src_len = strlen(src);
  153. }
  154. for (i = 0; i < src_len;)
  155. {
  156. if (j >= buf_len - 1)
  157. break;
  158. if (src[i] >= 0)
  159. {
  160. buf[j++] = src[i++];
  161. }
  162. else
  163. {
  164. unsigned short w_c = 0;
  165. char tmp[4] = "";
  166. Gb2312_2_Unicode(&w_c, src + i);
  167. Unicode_2_UTF8(tmp, &w_c);
  168. buf[j+0] = tmp[0];
  169. buf[j+1] = tmp[1];
  170. buf[j+2] = tmp[2];
  171. i += 2;
  172. j += 3;
  173. }
  174. }
  175. buf[j] = '\0';
  176. return j;
  177. }
  178. void Gb2312_2_Unicode(unsigned short* dst, const char* src)
  179. {
  180. MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, src, 2, (LPWSTR)dst, 1);
  181. }
  182. void Unicode_2_UTF8(char* dst, unsigned short* src)
  183. {
  184. char *pchar = (char *)src;
  185. dst[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
  186. dst[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
  187. dst[2] = (0x80 | ( pchar[0] & 0x3F));
  188. }
  189. string ConvertUTF8toGB2312(const char *pData, size_t size)
  190. {
  191. size_t n = MultiByteToWideChar(CP_UTF8, 0, pData, (int)size, NULL, 0);
  192. WCHAR *pChar = new WCHAR[n+1];
  193. n = MultiByteToWideChar(CP_UTF8, 0, pData, (int)size, pChar, n);
  194. pChar[n]=0;
  195. n = WideCharToMultiByte(CP_ACP, 0, pChar, -1, 0, 0, 0, 0);
  196. char *p = new char[n+1];
  197. n = WideCharToMultiByte(CP_ACP, 0, pChar, -1, p, (int)n, 0, 0);
  198. string result(p);
  199. delete []pChar;
  200. delete []p;
  201. return result;
  202. }
  203. wstring UTF8ToUnicode(const char* szU8)
  204. {
  205. wstring str;
  206. if (szU8 == NULL)
  207. {
  208. return str;
  209. }
  210. //预转换,得到所需空间的大小;
  211. int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
  212. if (wcsLen <= 0) return str;
  213. //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
  214. wchar_t* pWStr = (wchar_t*)calloc(wcsLen + 1, sizeof(wchar_t));
  215. //转换
  216. ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), pWStr, wcsLen);
  217. pWStr[wcsLen] = L'\0';
  218. str = pWStr;
  219. if (pWStr) free(pWStr);
  220. return str;
  221. }
  222. string UnicodeToUTF8(const wchar_t* unicode)
  223. {
  224. string str;
  225. int len;
  226. len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
  227. if (len <= 0) return str;
  228. char *szUtf8 = (char*)calloc(len + 1, sizeof(char));
  229. WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
  230. szUtf8[len] = '\0';
  231. str = szUtf8;
  232. if (szUtf8) free(szUtf8);
  233. return str;
  234. }
  235. int CalcWord(const char *ps, const size_t length)
  236. {
  237. ASSERT(0 < length);
  238. ASSERT(NULL != ps);
  239. int nRealLen(0);
  240. int nFlag(0);
  241. while (nFlag <= length && 0 != ps[nRealLen])
  242. {
  243. if (IsChinese(ps[nRealLen]))
  244. {
  245. nRealLen++;
  246. if (0 != ps[nRealLen])
  247. nRealLen++;
  248. else
  249. break;
  250. }
  251. else
  252. nRealLen++;
  253. nFlag++;
  254. }
  255. return nRealLen;
  256. }
  257. void Int64DateToStr(const __int64& llDate, string& out)
  258. {
  259. int nYear = llDate / 10000000000L;
  260. int nMode = llDate % 10000000000L;
  261. int nMon = nMode / 100000000;
  262. nMode %= 100000000;
  263. int nDay = nMode / 1000000;
  264. nMode %= 1000000;
  265. int nHour = nMode / 10000;
  266. nMode %= 10000;
  267. int nMin = nMode / 100;
  268. int nSec = nMode % 100;
  269. char buf[20];
  270. memset(buf, 0, 20);
  271. sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d", nYear,nMon,nDay,nHour,nMin,nSec);
  272. out = buf;
  273. }
  274. void Int64DateToYMDStr(const __int64& llDate, string& out)
  275. {
  276. int nYear = llDate / 10000000000L;
  277. int nMode = llDate % 10000000000L;
  278. int nMon = nMode / 100000000;
  279. nMode %= 100000000;
  280. int nDay = nMode / 1000000;
  281. nMode %= 1000000;
  282. char buf[20];
  283. memset(buf, 0, 20);
  284. sprintf(buf, "%04d-%02d-%02d", nYear,nMon,nDay);
  285. out = buf;
  286. }
  287. void Int64DateToHMStr(const __int64& llDate, string& out)
  288. {
  289. int nYear = llDate / 10000000000L;
  290. int nMode = llDate % 10000000000L;
  291. int nMon = nMode / 100000000;
  292. nMode %= 100000000;
  293. int nDay = nMode / 1000000;
  294. nMode %= 1000000;
  295. int nHour = nMode / 10000;
  296. nMode %= 10000;
  297. int nMin = nMode / 100;
  298. char buf[20];
  299. memset(buf, 0, 20);
  300. sprintf(buf, "%02d:%02d", nHour,nMin);
  301. out = buf;
  302. }
  303. unsigned char ToHex(unsigned char x)
  304. {
  305. return x > 9 ? x + 55 : x + 48;
  306. }
  307. unsigned char FromHex(unsigned char x)
  308. {
  309. unsigned char y;
  310. if (x >= 'A' && x <= 'Z') y = x - 'A' + 10;
  311. else if (x >= 'a' && x <= 'z') y = x - 'a' + 10;
  312. else if (x >= '0' && x <= '9') y = x - '0';
  313. return y;
  314. }
  315. std::string UrlEncode(const std::string& str)
  316. {
  317. std::string strTemp = "";
  318. size_t length = str.length();
  319. for (size_t i = 0; i < length; i++)
  320. {
  321. if (isalnum((unsigned char)str[i]) ||
  322. (str[i] == '-') ||
  323. (str[i] == '_') ||
  324. (str[i] == '.') ||
  325. (str[i] == '~'))
  326. strTemp += str[i];
  327. else if (str[i] == ' ')
  328. strTemp += "+";
  329. else
  330. {
  331. strTemp += '%';
  332. strTemp += ToHex((unsigned char)str[i] >> 4);
  333. strTemp += ToHex((unsigned char)str[i] % 16);
  334. }
  335. }
  336. return strTemp;
  337. }
  338. std::string UrlDecode(const std::string& str)
  339. {
  340. std::string strTemp = "";
  341. size_t length = str.length();
  342. for (size_t i = 0; i < length; i++)
  343. {
  344. if (str[i] == '+') strTemp += ' ';
  345. else if (str[i] == '%')
  346. {
  347. unsigned char high = FromHex((unsigned char)str[++i]);
  348. unsigned char low = FromHex((unsigned char)str[++i]);
  349. strTemp += high*16 + low;
  350. }
  351. else strTemp += str[i];
  352. }
  353. return strTemp;
  354. }
  355. void RecursiveDirectory(CString cstrDir) // 递归创建目录
  356. {
  357. if (cstrDir.GetLength() <= 3)//是根目录,无需创建目录
  358. {
  359. return;
  360. }
  361. if (cstrDir[cstrDir.GetLength()-1] == '\\') // 将路径改为目录
  362. {
  363. cstrDir.Delete(cstrDir.GetLength()-1, 1);
  364. }
  365. // 修改文件属性
  366. WIN32_FIND_DATA wfd;
  367. HANDLE hFind = FindFirstFile(cstrDir, &wfd); // 查找
  368. if (hFind != INVALID_HANDLE_VALUE)
  369. {
  370. FindClose(hFind);
  371. if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  372. return;
  373. }
  374. // 创建当前目录的地目录失败
  375. if (CreateDirectory(cstrDir,NULL) == false)
  376. {// 退到上一级目录
  377. CString wstrNewDir = cstrDir;
  378. int n = wstrNewDir.ReverseFind('\\');
  379. wstrNewDir = cstrDir.Left(n);
  380. // 递归进入
  381. RecursiveDirectory(wstrNewDir); // 递归本函数,再创建目录
  382. // 递归退出后创建之前失败的目录
  383. CreateDirectory(cstrDir,NULL); // 递归返回,在存在的目录上再建目录
  384. }// 多级目录创建成功
  385. }
  386. void toUpper(char *szDestination, const char *szSource)
  387. {
  388. if (szDestination == NULL || szSource == NULL || strlen(szSource) == 0)
  389. return;
  390. while (*szSource != 0)
  391. {
  392. if (*szSource >= 'a' && *szSource <= 'z')
  393. *szDestination++ = 'A' + (*szSource++ - 'a');
  394. else
  395. *szDestination++ = *szSource++;
  396. }
  397. *szDestination = 0;
  398. }
  399. void FormatPrice(char *szDes, const double dSource)
  400. {
  401. sprintf(szDes, "%.9lf", dSource);
  402. int i(0);
  403. int nLen(strlen(szDes));
  404. for (; i < nLen; i++)
  405. {
  406. if (szDes[i] == '.')
  407. break;
  408. }
  409. for (int j = nLen - 1; j > i + 2; j--)
  410. {
  411. if (szDes[j] == '0')
  412. szDes[j] = 0;
  413. else
  414. break;
  415. }
  416. }
  417. bool CombinationVolRemark(string &strDes, const char *szVol, const char *szRemark)
  418. {
  419. vector<string> vctVol;
  420. vector<string> vctRemark;
  421. bool bRet(true);
  422. if (!split(szVol, "|", vctVol))
  423. bRet = false;
  424. if (!split(szRemark, "|", vctRemark))
  425. bRet = false;
  426. if (vctVol.size() != vctRemark.size())
  427. bRet = false;
  428. if (!bRet)
  429. {
  430. if (!split(szVol, "+", vctVol))
  431. bRet = false;
  432. else
  433. bRet = true;
  434. if (!split(szRemark, "+", vctRemark))
  435. bRet = false;
  436. else
  437. bRet = true;
  438. if (vctVol.size() != vctRemark.size())
  439. bRet = false;
  440. }
  441. if (!bRet)
  442. return bRet;
  443. for (int i = 0; i < vctVol.size(); i++)
  444. {
  445. if (i != 0)
  446. strDes.append("+");
  447. if (vctVol[i].empty())
  448. strDes.append("--");
  449. else
  450. strDes.append(vctVol[i]);
  451. if (!vctRemark[i].empty())
  452. {
  453. strDes.append("(");
  454. strDes.append(vctRemark[i]);
  455. strDes.append(")");
  456. }
  457. }
  458. return true;
  459. }
  460. bool CombinationQuoteData(string &strDes, const char *szVol, const char *szRemark/* = NULL*/
  461. , const char *szDanger/* = NULL*/, const char *szOCO/* = NULL*/, const char *szPACK/* = NULL*/)
  462. {
  463. if (szVol == NULL)
  464. return false;
  465. vector<const char*> vctData;
  466. vctData.push_back(szVol);
  467. if (szDanger != NULL)
  468. {
  469. vctData.push_back(szDanger);
  470. }
  471. if (szOCO != NULL)
  472. {
  473. vctData.push_back(szOCO);
  474. }
  475. if (szPACK != NULL)
  476. {
  477. vctData.push_back(szPACK);
  478. }
  479. if (szRemark != NULL && strlen(szRemark) > 0 && strcmp(szRemark, "--") != 0)
  480. {
  481. vctData.push_back(szRemark);
  482. }
  483. const char* arrSeparators[2] = {"|", "+"};
  484. bool bMulti(false);
  485. int nIdx(0);
  486. for (int i = 0; i < 2; i++)
  487. {
  488. if (strstr(szVol, arrSeparators[i]) != NULL)
  489. {
  490. nIdx = i;
  491. bMulti = true;
  492. break;
  493. }
  494. }
  495. if (bMulti)
  496. {
  497. vector<vector<string>> vctSplit;
  498. for (int i = 0; i < vctData.size(); i++)
  499. {
  500. vector<string> vct;
  501. if (!split(vctData[i], arrSeparators[nIdx], vct))
  502. {
  503. return false;
  504. }
  505. vctSplit.push_back(vct);
  506. }
  507. int nCount(vctSplit[0].size());
  508. for (int i = 1; i < vctSplit.size(); i++)
  509. {
  510. if (nCount != vctSplit[i].size())
  511. return false;
  512. }
  513. for (int i = 0; i < nCount; i++)
  514. {
  515. if (i != 0)
  516. strDes.append("+");
  517. if (strlen((vctSplit[0])[i].c_str()) == 0)
  518. strDes.append("--");
  519. else
  520. {
  521. strDes.append((vctSplit[0])[i]);
  522. }
  523. string strTemp;
  524. for (int j = 1; j < vctSplit.size(); j++)
  525. {
  526. if (strlen((vctSplit[j])[i].c_str()) != 0)
  527. {
  528. strTemp.append((vctSplit[j])[i]);
  529. strTemp.append(",");
  530. }
  531. }
  532. if (!strTemp.empty())
  533. {
  534. if (strTemp[strTemp.size() - 1] == ',')
  535. {
  536. strTemp = string(strTemp.c_str(), strTemp.size() - 1);
  537. }
  538. }
  539. if (!strTemp.empty())
  540. {
  541. strDes.append("(");
  542. strDes.append(strTemp);
  543. strDes.append(")");
  544. }
  545. }
  546. }
  547. else
  548. {
  549. if (strlen(szVol) == 0)
  550. {
  551. strDes.append("--");
  552. }
  553. else
  554. {
  555. strDes.append(szVol);
  556. }
  557. string strTemp;
  558. for (int i = 1; i < vctData.size(); i++)
  559. {
  560. if (strlen(vctData[i]) != 0)
  561. {
  562. strTemp.append(vctData[i]);
  563. strTemp.append(",");
  564. }
  565. }
  566. if (!strTemp.empty())
  567. {
  568. if (strTemp[strTemp.size() - 1] == ',')
  569. {
  570. strTemp = string(strTemp.c_str(), strTemp.size() - 1);
  571. }
  572. }
  573. if (!strTemp.empty())
  574. {
  575. strDes.append("(");
  576. strDes.append(strTemp);
  577. strDes.append(")");
  578. }
  579. }
  580. return true;
  581. }
  582. //获取ODBC中Excel驱动函数
  583. CString GetExcelDriverInfo()
  584. {
  585. TCHAR szBuf[2001];
  586. WORD cbBufMax = 2000;
  587. WORD cbBufOut;
  588. TCHAR *pszBuf = szBuf;
  589. CString sDriver=L"";
  590. // 获取已安装驱动的名称(涵数在odbcinst.h里)
  591. if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
  592. return L"";
  593. // 检索已安装的驱动是否有Excel...
  594. do
  595. {
  596. if (StrStrW(pszBuf, L"Excel") != 0)
  597. {
  598. //发现 !
  599. CString temp(pszBuf);
  600. //if(sDriver.GetLength() < temp.GetLength())
  601. sDriver = temp;
  602. break;
  603. }
  604. pszBuf = StrStrW(pszBuf, L'\0') + 1;
  605. }
  606. while (pszBuf[1] != L'\0');
  607. return sDriver;
  608. }
  609. __int64 StringToInt64(const char *szSource)
  610. {
  611. __int64 ret(0);
  612. if (strlen(szSource) == 0)
  613. return ret;
  614. const char *pTemp = szSource + strlen(szSource) - 1;
  615. __int64 nRight(1);
  616. bool bNegative(false);
  617. if ('-' == szSource[0])
  618. bNegative = true;
  619. do
  620. {
  621. if (*pTemp >= '0' && *pTemp <= '9')
  622. {
  623. ret += nRight * (0 + (*pTemp - '0'));
  624. nRight *= 10;
  625. }
  626. }
  627. while(pTemp-- != szSource);
  628. if (bNegative)
  629. ret = -ret;
  630. return ret;
  631. }
  632. string GetRequestByKey(const string& strKey, const string& strReuest)
  633. {
  634. try
  635. {
  636. smatch result;
  637. if (regex_search(strReuest.cbegin(), strReuest.cend(), result, regex(strKey + "=(.*?)&")))
  638. {
  639. return result[1];
  640. }
  641. else if (regex_search(strReuest.cbegin(), strReuest.cend(), result, regex(strKey + "=(.*)")))
  642. {
  643. return result[1];
  644. }
  645. else
  646. {
  647. return string();
  648. }
  649. }
  650. catch (...)
  651. {
  652. return string();
  653. }
  654. return string();
  655. }
  656. void GetKeysByUrl(const string & strUrl, vector<string> & vctKey)
  657. {
  658. vector<string> vctSearch;
  659. split(strUrl, "?", vctSearch);
  660. if (vctSearch.size() != 2 && vctSearch.size() != 1)
  661. {
  662. return;
  663. }
  664. string strTemp;
  665. if (vctSearch.size() == 1)
  666. {
  667. strTemp = vctSearch[0];
  668. }
  669. else if (vctSearch.size() == 2)
  670. {
  671. strTemp = vctSearch[1];
  672. }
  673. vctSearch.clear();
  674. split(strTemp, "&", vctSearch);
  675. if (vctSearch.size() <= 0)
  676. {
  677. return;
  678. }
  679. for (int i = 0; i < vctSearch.size(); i++)
  680. {
  681. strTemp = vctSearch[i];
  682. vector<string> vct;
  683. split(strTemp, "=", vct);
  684. if (vct.size() == 2)
  685. {
  686. vctKey.push_back(vct[0]);
  687. }
  688. }
  689. }
  690. __int64 GetCharNumber(char* szText, size_t n)
  691. {
  692. __int64 nDest;
  693. if (n == 0)
  694. {
  695. return -1;
  696. }
  697. for (nDest = 0; n--; szText++)
  698. {
  699. if (*szText < '0' || *szText > '9')
  700. {
  701. continue; //继续获取下一个字符
  702. }
  703. /*
  704. 1、当前字符值 *line的ascii码,减去字符0的ascii码,得出个位数字
  705. 2、原计算的value值 乘以10,向上提升一位
  706. 3、二者相加得到新的十进制数值
  707. */
  708. nDest = nDest * 10 + (*szText - '0');
  709. }
  710. if (nDest < 0)
  711. {
  712. return -1;
  713. }
  714. else
  715. {
  716. return nDest;
  717. }
  718. }
  719. CStringW CStrA2W(const CStringA &cstrSrcA)
  720. {
  721. int len = MultiByteToWideChar(CP_ACP, 0, LPCSTR(cstrSrcA), -1, NULL, 0);
  722. wchar_t *wstr = new wchar_t[len];
  723. memset(wstr, 0, len*sizeof(wchar_t));
  724. MultiByteToWideChar(CP_ACP, 0, LPCSTR(cstrSrcA), -1, wstr, len);
  725. CStringW cstrDestW = wstr;
  726. delete[] wstr;
  727. return cstrDestW;
  728. }
  729. CStringA CStrW2A(const CStringW &cstrSrcW)
  730. {
  731. int len = WideCharToMultiByte(CP_ACP, 0, LPCWSTR(cstrSrcW), -1, NULL, 0, NULL, NULL);
  732. char *str = new char[len];
  733. memset(str, 0, len);
  734. WideCharToMultiByte(CP_ACP, 0, LPCWSTR(cstrSrcW), -1, str, len, NULL, NULL);
  735. CStringA cstrDestA = str;
  736. delete[] str;
  737. return cstrDestA;
  738. }
  739. bool RegexStdMatch(string src, string regular)
  740. {
  741. regex pattern(regular.c_str());
  742. if (!regex_match(src, pattern))
  743. {
  744. return false;
  745. }
  746. return true;
  747. }
  748. bool RegexStdMatch(wstring src, wstring regular)
  749. {
  750. char* pre = setlocale(LC_ALL, "");
  751. setlocale(LC_ALL, "chs");
  752. std::wregex pattern(regular.c_str());
  753. if (!regex_match(src, pattern))
  754. {
  755. return false;
  756. }
  757. return true;
  758. }
  759. string replace_all(string& str, const string& old_value, const string& new_value)
  760. {
  761. while (true)
  762. {
  763. string::size_type pos(0);
  764. if ((pos = str.find(old_value)) != string::npos)
  765. str.replace(pos, old_value.length(), new_value);
  766. else break;
  767. }
  768. return str;
  769. }
  770. void sync_system_time(ULONGLONG time)
  771. {
  772. time_t _time = time;
  773. struct tm *tim = localtime(&_time);
  774. SYSTEMTIME system_time = {0}; //先获取本地时间
  775. system_time.wYear = tim->tm_year+1900;
  776. system_time.wMonth =tim->tm_mon+1;
  777. system_time.wDay = tim->tm_mday;
  778. system_time.wHour = tim->tm_hour;
  779. system_time.wMinute = tim->tm_min;
  780. system_time.wSecond = tim->tm_sec;
  781. SetLocalTime(&system_time);
  782. }
  783. CString GetExePath()
  784. {
  785. HMODULE module = GetModuleHandle(0);
  786. TCHAR pFileName[MAX_PATH + 2] = { 0 };
  787. GetModuleFileName(module, pFileName, MAX_PATH);
  788. CString csFullPath(pFileName);
  789. int nPos = csFullPath.ReverseFind(_T('\\'));
  790. if (nPos < 0)
  791. return CString("");
  792. else
  793. return csFullPath.Left(nPos);
  794. }