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

40 lines
983 B

12 months ago
  1. #include <iconv.h>
  2. #include "ziconv.hpp"
  3. using namespace iflytop;
  4. string ZIconv::utf8_to_gb2312(const std::string& utf8_str) {
  5. // 打开转换描述符
  6. iconv_t cd = iconv_open("GB2312", "UTF-8");
  7. if (cd == (iconv_t)-1) {
  8. perror("iconv_open failed");
  9. exit(EXIT_FAILURE);
  10. }
  11. // 输入字符串
  12. const char* in_str = utf8_str.c_str();
  13. size_t in_size = utf8_str.size();
  14. // 输出缓冲区
  15. size_t out_size = in_size * 2; // 假设输出的字节数不会超过输入的两倍
  16. char* out_buf = new char[out_size];
  17. char* out_str = out_buf;
  18. // 进行转换
  19. if (iconv(cd, const_cast<char**>(&in_str), &in_size, &out_str, &out_size) == (size_t)-1) {
  20. perror("iconv failed");
  21. iconv_close(cd);
  22. delete[] out_buf;
  23. exit(EXIT_FAILURE);
  24. }
  25. // 关闭转换描述符
  26. iconv_close(cd);
  27. // 获取转换后的字符串
  28. std::string gb2312_str(out_buf, out_str - out_buf);
  29. // 释放内存
  30. delete[] out_buf;
  31. return gb2312_str;
  32. }