SpUtility.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #include "precompile.h"
  2. #include "SpUtility.h"
  3. #include "charset.h"
  4. #include "dbgutil.h"
  5. #include <regex>
  6. #define TAG SPBASE_TAG("SpUtility")
  7. namespace SP
  8. {
  9. namespace Utility
  10. {
  11. namespace
  12. {
  13. enum CPType
  14. {
  15. ACP = 0,
  16. OEMCP = 1,
  17. MACCP = 2,
  18. THREAD_ACP = 3,
  19. SYMBOL = 42,
  20. UTF7 = 65000,
  21. UTF8 = 65001
  22. };
  23. static std::wstring LocaleToWStr(const std::string& str, const char* locale_name, CPType cp_type)
  24. {
  25. #ifdef _MSC_VER
  26. wchar_t* wstr = NULL;
  27. int n = ::MultiByteToWideChar((UINT)cp_type, 0, str.c_str(), -1, NULL, 0);
  28. if (n > 0) {
  29. wstr = new wchar_t[n + 1];
  30. if (wstr == NULL) {
  31. return std::wstring();
  32. }
  33. std::memset(wstr, 0, (n + 1) * sizeof(wchar_t));
  34. ::MultiByteToWideChar((UINT)cp_type, 0, str.c_str(), -1, &wstr[0], n);
  35. std::wstring strr(wstr);
  36. delete wstr;
  37. return strr;
  38. }
  39. return std::wstring();
  40. #else
  41. if (str.empty()) {
  42. return L"";
  43. }
  44. unsigned len = str.size() + 1;
  45. const char* origin = setlocale(LC_CTYPE, NULL);
  46. if (NULL == setlocale(LC_CTYPE, locale_name)) {
  47. printf("setlocale with \"%s\" failed!\n", locale_name);
  48. }
  49. wchar_t* p = new wchar_t[len];
  50. mbstowcs(p, str.c_str(), len);
  51. std::wstring w_str(p);
  52. delete[] p;
  53. setlocale(LC_CTYPE, origin);
  54. return w_str;
  55. #endif
  56. }
  57. static std::string WStrToLocale(const std::wstring wstr, const char* locale_name, CPType cp_type)
  58. {
  59. #ifdef _MSC_VER
  60. char* str = NULL;
  61. int n = ::WideCharToMultiByte((UINT)cp_type, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
  62. if (n > 0) {
  63. str = new char[n + 1];
  64. if (str == NULL) {
  65. return std::string();
  66. }
  67. std::memset(str, 0, sizeof(char) * (n + 1));
  68. ::WideCharToMultiByte((UINT)cp_type, 0, wstr.c_str(), -1, &str[0], n, NULL, NULL);
  69. std::string strr(str);
  70. delete str;
  71. return strr;
  72. }
  73. return std::string();
  74. #else
  75. if (wstr.empty()) {
  76. return "";
  77. }
  78. const char* origin = setlocale(LC_CTYPE, NULL);
  79. if (NULL == setlocale(LC_CTYPE, locale_name)) {
  80. printf("setlocale with \"%s\" failed!\n", locale_name);
  81. }
  82. unsigned len = wcstombs(NULL, wstr.c_str(), 0) + 1;
  83. char* p = new char[len];
  84. wcstombs(p, wstr.c_str(), len);
  85. TOOLKIT_ASSERT(len >= 1);
  86. p[len - 1] = '\0';
  87. std::string str(p);
  88. delete[] p;
  89. setlocale(LC_CTYPE, origin);
  90. return str;
  91. #endif
  92. }
  93. }
  94. std::string GBK2UTF8(const std::string str)
  95. {
  96. std::string result("");
  97. if (str.empty())
  98. return result;
  99. if (toolkit_detect_utf8_str(str.c_str())) {
  100. result = str;
  101. } else {
  102. auto ret = toolkit_gbk2utf8((char*)str.c_str(), str.length(), NULL, 0);
  103. if (ret <= 0)
  104. return result;
  105. char* arr = new char[ret];
  106. ret = toolkit_gbk2utf8((char*)str.c_str(), str.length(), arr, ret);
  107. if (ret > 0) {
  108. result = arr;
  109. }
  110. delete[] arr;
  111. }
  112. return result;
  113. }
  114. std::string UTF8ToGBK(const std::string str)
  115. {
  116. std::string result("");
  117. if (str.empty())
  118. return result;
  119. if (!toolkit_detect_utf8_str(str.c_str())) {
  120. result = str;
  121. } else {
  122. auto ret = toolkit_utf82gbk((char*)str.c_str(), str.length(), NULL, 0);
  123. if (ret <= 0)
  124. return result;
  125. char* arr = new char[ret];
  126. ret = toolkit_utf82gbk((char*)str.c_str(), str.length(), arr, ret);
  127. if (ret > 0) {
  128. result = arr;
  129. }
  130. delete[] arr;
  131. }
  132. return result;
  133. }
  134. bool IsNum(const std::string& value)
  135. {
  136. if (value.empty()) {
  137. return false;
  138. }
  139. std::regex pattern("^[0-9]+$");
  140. if (std::regex_match(value, pattern)) {
  141. return true;
  142. }
  143. else {
  144. return false;
  145. }
  146. }
  147. bool CheckIPv4(const std::string& value)
  148. {
  149. if (value.empty()) {
  150. return false;
  151. }
  152. std::vector<std::string> elems = SP::Utility::Split(value, '.');
  153. if (elems.size() != 4) {
  154. return false;
  155. }
  156. for (int i = 0; i < 4; i++) {
  157. if (!IsNum(elems[i])) {
  158. return false;
  159. }
  160. if (elems[i].find(' ') != std::string::npos) {
  161. return false;
  162. }
  163. if ((elems[i].find('0') == 0) && (elems[i].length() != 1)) {
  164. return false;
  165. }
  166. }
  167. if ((stoi(elems[0]) < 0 || stoi(elems[0]) > 255) ||
  168. (stoi(elems[1]) < 0 || stoi(elems[1]) > 255) ||
  169. (stoi(elems[2]) < 0 || stoi(elems[2]) > 255) ||
  170. (stoi(elems[3]) < 0 || stoi(elems[3]) > 255)) {
  171. return false;
  172. }
  173. return true;
  174. }
  175. bool IsValidUrl(const std::string& value)
  176. {
  177. if (value.empty()) {
  178. return false;
  179. }
  180. else {
  181. std::string strUrl = ToLower(value.c_str());
  182. std::string pattern = "^((https|http)://)";
  183. pattern += "(([0-9a-z_!~*\\'().&=+$%-]+: )?[0-9a-z_!~*\\'().&=+$%-]+@)?";
  184. pattern += "(([0-9]{1,3}\\.){3}[0-9]{1,3}";
  185. pattern += "|";
  186. pattern += "([0-9a-z_!~*\\'()-]+\\.)*";
  187. pattern += "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\.";
  188. pattern += "[a-z]{2,6})";
  189. pattern += "(:[0-9]{1,4})?";
  190. pattern += "((/?)|";
  191. pattern += "(/[0-9a-z_!~*\\'().;?:@&=+$,%#-]+)+/?)$";
  192. std::regex patternReg(pattern);
  193. if (std::regex_match(strUrl, patternReg)) {
  194. return true;
  195. }
  196. else {
  197. return false;
  198. }
  199. }
  200. }
  201. std::string W2S(const std::wstring wstr)
  202. {
  203. std::string result("");
  204. if (wstr.empty())
  205. return result;
  206. auto ret = toolkit_wcs2mbs(wstr.c_str(), NULL, 0);
  207. if (ret <= 0)
  208. return result;
  209. char* arr = new char[ret];
  210. ret = toolkit_wcs2mbs(wstr.c_str(), arr, ret);
  211. if (ret <= 0) {
  212. delete[] arr;
  213. return result;
  214. }
  215. result = arr;
  216. delete[] arr;
  217. return result;
  218. }
  219. std::wstring S2W(const std::string str)
  220. {
  221. std::wstring result(L"");
  222. if (str.empty())
  223. return result;
  224. auto ret = toolkit_mbs2wcs(str.c_str(), NULL, 0);
  225. if (ret <= 0)
  226. return result;
  227. wchar_t* arr = new wchar_t[ret];
  228. ret = toolkit_mbs2wcs(str.c_str(), arr, ret);
  229. if (ret <= 0) {
  230. delete[] arr;
  231. return result;
  232. }
  233. result = arr;
  234. delete[] arr;
  235. return result;
  236. }
  237. }
  238. }