You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

encoding.cpp 1.6 kB

8 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "encoding.h"
  2. #include <iconv.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <stdio.h>
  7. Encoding* encIn = new Encoding("GBK", "UTF-8");
  8. Encoding* encOut = new Encoding("UTF-8", "GBK");
  9. Encoding::Encoding(const string &fromCharset, const string &toCharset)
  10. {
  11. //iconv_open is a freek(to goes first)
  12. mIconv = iconv_open(toCharset.c_str(), fromCharset.c_str());
  13. }
  14. Encoding::~Encoding()
  15. {
  16. if (mIconv != (iconv_t)-1)
  17. iconv_close(mIconv);
  18. }
  19. vector<char> Encoding::convert(const vector<char> &str)
  20. {
  21. vector<char> result(str.size()*3);
  22. auto len = result.size();
  23. if (convert(str.data(), str.size(), result.data(), &len))
  24. {
  25. result.resize(len);
  26. result.shrink_to_fit();
  27. return result;
  28. }
  29. return str;
  30. }
  31. string Encoding::convert(const string &str)
  32. {
  33. auto len = str.length()*3;
  34. unique_ptr<char[]> buf(new char[len]);
  35. if (convert(str.data(), str.size(), buf.get(), &len))
  36. {
  37. string result = buf.get();
  38. return result;
  39. }
  40. return str;
  41. }
  42. bool Encoding::convert(const char *input, size_t len, char *output, size_t *outLen)
  43. {
  44. if (mIconv == (iconv_t)-1)
  45. return false;
  46. //copy in str
  47. size_t inLen = len;
  48. auto inBuf = unique_ptr<char[]>(new char[inLen+1]);
  49. char* pIn = inBuf.get();
  50. memcpy(pIn, input, inLen);
  51. pIn[inLen]=0;
  52. //do convert
  53. int ret = iconv(mIconv, &pIn, &inLen, &output, outLen);
  54. if (ret == -1)
  55. {
  56. perror("convert failed");
  57. return false;
  58. }
  59. *output = 0;
  60. return true;
  61. }

mac下的“飞秋”大多数只是飞鸽传书协议,而且未发现令人满意的开源项目,所以基于c++与qt实现了基础的飞秋协议。

Contributors (1)