SpUtility.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #include "precompile.h"
  2. #include "SpUtility.h"
  3. #include "charset.h"
  4. #include "dbgutil.h"
  5. #define TAG SPBASE_TAG("SpUtility")
  6. namespace SP
  7. {
  8. namespace Utility
  9. {
  10. namespace
  11. {
  12. enum CPType
  13. {
  14. ACP = 0,
  15. OEMCP = 1,
  16. MACCP = 2,
  17. THREAD_ACP = 3,
  18. SYMBOL = 42,
  19. UTF7 = 65000,
  20. UTF8 = 65001
  21. };
  22. static std::wstring LocaleToWStr(const std::string& str, const char* locale_name, CPType cp_type)
  23. {
  24. #ifdef _MSC_VER
  25. wchar_t* wstr = NULL;
  26. int n = ::MultiByteToWideChar((UINT)cp_type, 0, str.c_str(), -1, NULL, 0);
  27. if (n > 0) {
  28. wstr = new wchar_t[n + 1];
  29. if (wstr == NULL) {
  30. return std::wstring();
  31. }
  32. std::memset(wstr, 0, (n + 1) * sizeof(wchar_t));
  33. ::MultiByteToWideChar((UINT)cp_type, 0, str.c_str(), -1, &wstr[0], n);
  34. std::wstring strr(wstr);
  35. delete wstr;
  36. return strr;
  37. }
  38. return std::wstring();
  39. #else
  40. if (str.empty()) {
  41. return L"";
  42. }
  43. unsigned len = str.size() + 1;
  44. const char* origin = setlocale(LC_CTYPE, NULL);
  45. if (NULL == setlocale(LC_CTYPE, locale_name)) {
  46. printf("setlocale with \"%s\" failed!\n", locale_name);
  47. }
  48. wchar_t* p = new wchar_t[len];
  49. mbstowcs(p, str.c_str(), len);
  50. std::wstring w_str(p);
  51. delete[] p;
  52. setlocale(LC_CTYPE, origin);
  53. return w_str;
  54. #endif
  55. }
  56. static std::string WStrToLocale(const std::wstring wstr, const char* locale_name, CPType cp_type)
  57. {
  58. #ifdef _MSC_VER
  59. char* str = NULL;
  60. int n = ::WideCharToMultiByte((UINT)cp_type, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
  61. if (n > 0) {
  62. str = new char[n + 1];
  63. if (str == NULL) {
  64. return std::string();
  65. }
  66. std::memset(str, 0, sizeof(char) * (n + 1));
  67. ::WideCharToMultiByte((UINT)cp_type, 0, wstr.c_str(), -1, &str[0], n, NULL, NULL);
  68. std::string strr(str);
  69. delete str;
  70. return strr;
  71. }
  72. return std::string();
  73. #else
  74. if (wstr.empty()) {
  75. return "";
  76. }
  77. const char* origin = setlocale(LC_CTYPE, NULL);
  78. if (NULL == setlocale(LC_CTYPE, locale_name)) {
  79. printf("setlocale with \"%s\" failed!\n", locale_name);
  80. }
  81. unsigned len = wcstombs(NULL, wstr.c_str(), 0) + 1;
  82. char* p = new char[len];
  83. wcstombs(p, wstr.c_str(), len);
  84. TOOLKIT_ASSERT(len >= 1);
  85. p[len - 1] = '\0';
  86. std::string str(p);
  87. delete[] p;
  88. setlocale(LC_CTYPE, origin);
  89. return str;
  90. #endif
  91. }
  92. }
  93. std::string GBK2UTF8(const std::string str)
  94. {
  95. std::string result("");
  96. if (str.empty())
  97. return result;
  98. if (toolkit_detect_utf8_str(str.c_str())) {
  99. result = str;
  100. } else {
  101. auto ret = toolkit_gbk2utf8((char*)str.c_str(), str.length(), NULL, 0);
  102. if (ret <= 0)
  103. return result;
  104. char* arr = new char[ret];
  105. ret = toolkit_gbk2utf8((char*)str.c_str(), str.length(), arr, ret);
  106. if (ret > 0) {
  107. result = arr;
  108. }
  109. delete[] arr;
  110. }
  111. return result;
  112. }
  113. std::string UTF8ToGBK(const std::string str)
  114. {
  115. std::string result("");
  116. if (str.empty())
  117. return result;
  118. if (!toolkit_detect_utf8_str(str.c_str())) {
  119. result = str;
  120. } else {
  121. auto ret = toolkit_utf82gbk((char*)str.c_str(), str.length(), NULL, 0);
  122. if (ret <= 0)
  123. return result;
  124. char* arr = new char[ret];
  125. ret = toolkit_utf82gbk((char*)str.c_str(), str.length(), arr, ret);
  126. if (ret > 0) {
  127. result = arr;
  128. }
  129. delete[] arr;
  130. }
  131. return result;
  132. }
  133. std::string W2S(const std::wstring wstr)
  134. {
  135. std::string result("");
  136. if (wstr.empty())
  137. return result;
  138. auto ret = toolkit_wcs2mbs(wstr.c_str(), NULL, 0);
  139. if (ret <= 0)
  140. return result;
  141. char* arr = new char[ret];
  142. ret = toolkit_wcs2mbs(wstr.c_str(), arr, ret);
  143. if (ret <= 0) {
  144. delete[] arr;
  145. return result;
  146. }
  147. result = arr;
  148. delete[] arr;
  149. return result;
  150. }
  151. std::wstring S2W(const std::string str)
  152. {
  153. std::wstring result(L"");
  154. if (str.empty())
  155. return result;
  156. auto ret = toolkit_mbs2wcs(str.c_str(), NULL, 0);
  157. if (ret <= 0)
  158. return result;
  159. wchar_t* arr = new wchar_t[ret];
  160. ret = toolkit_mbs2wcs(str.c_str(), arr, ret);
  161. if (ret <= 0) {
  162. delete[] arr;
  163. return result;
  164. }
  165. result = arr;
  166. delete[] arr;
  167. return result;
  168. }
  169. }
  170. }