string_convert.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. //
  2. // Created by huli on 2021/12/20.
  3. //
  4. #include "string_convert.h"
  5. String_convert::String_convert()
  6. {
  7. }
  8. String_convert::~String_convert()
  9. {
  10. }
  11. #ifdef _WIN32
  12. #include <windows.h>
  13. std::string String_convert::gbk_to_utf8(const char *src_str)
  14. {
  15. int len = MultiByteToWideChar(CP_ACP, 0, src_str, -1, NULL, 0);
  16. wchar_t* wstr = new wchar_t[len + 1];
  17. memset(wstr, 0, len + 1);
  18. MultiByteToWideChar(CP_ACP, 0, src_str, -1, wstr, len);
  19. len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
  20. char* str = new char[len + 1];
  21. memset(str, 0, len + 1);
  22. WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
  23. std::string strTemp = str;
  24. if (wstr) delete[] wstr;
  25. if (str) delete[] str;
  26. return strTemp;
  27. }
  28. std::string String_convert::utf8_to_gbk(const char *src_str)
  29. {
  30. int len = MultiByteToWideChar(CP_UTF8, 0, src_str, -1, NULL, 0);
  31. wchar_t* wszGBK = new wchar_t[len + 1];
  32. memset(wszGBK, 0, len * 2 + 2);
  33. MultiByteToWideChar(CP_UTF8, 0, src_str, -1, wszGBK, len);
  34. len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
  35. char* szGBK = new char[len + 1];
  36. memset(szGBK, 0, len + 1);
  37. WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
  38. std::string strTemp(szGBK);
  39. if (wszGBK) delete[] wszGBK;
  40. if (szGBK) delete[] szGBK;
  41. return strTemp;
  42. }
  43. #else
  44. #include <iconv.h>
  45. int String_convert::gbk_to_utf8(char *str_str, size_t src_len, char *dst_str, size_t dst_len)
  46. {
  47. iconv_t cd;
  48. char **pin = &str_str;
  49. char **pout = &dst_str;
  50. cd = iconv_open("utf8", "gbk");
  51. if (cd == 0)
  52. return -1;
  53. memset(dst_str, 0, dst_len);
  54. if (iconv(cd, pin, &src_len, pout, &dst_len) == -1)
  55. return -1;
  56. iconv_close(cd);
  57. **pout = '\0';
  58. return 0;
  59. }
  60. int String_convert::utf8_to_gbk(char *src_str, size_t src_len, char *dst_str, size_t dst_len)
  61. {
  62. iconv_t cd;
  63. char **pin = &src_str;
  64. char **pout = &dst_str;
  65. cd = iconv_open("gbk", "utf8");
  66. if (cd == 0)
  67. return -1;
  68. memset(dst_str, 0, dst_len);
  69. if (iconv(cd, pin, &src_len, pout, &dst_len) == -1)
  70. return -1;
  71. iconv_close(cd);
  72. **pout = '\0';
  73. return 0;
  74. }
  75. std::string String_convert::gbk_to_utf8(std::string src_str)
  76. {
  77. char* dst_str = new char[src_str.length() + 5];
  78. memset(dst_str, 0, src_str.length() + 5);
  79. std::string strTemp;
  80. if ( gbk_to_utf8( (char*)src_str.c_str(), src_str.length(), dst_str, src_str.length() + 5) == 0 )
  81. {
  82. strTemp = dst_str;
  83. }
  84. if ( dst_str )
  85. {
  86. delete(dst_str);
  87. }
  88. return strTemp;
  89. }
  90. std::string String_convert::utf8_to_gbk(std::string src_str)
  91. {
  92. char* dst_str = new char[src_str.length() + 5];
  93. memset(dst_str, 0, src_str.length() + 5);
  94. std::string strTemp;
  95. if ( utf8_to_gbk( (char*)src_str.c_str(), src_str.length(), dst_str, src_str.length() + 5) == 0 )
  96. {
  97. strTemp = dst_str;
  98. }
  99. if ( dst_str )
  100. {
  101. delete(dst_str);
  102. }
  103. return strTemp;
  104. }
  105. #endif