+#include "../include/charsetconverter.h"\r
+\r
+#include <vector>\r
+\r
+CharsetConverter::CharsetConverter()\r
+{\r
+ m_iconv=(iconv_t)-1;\r
+ m_fromcharset="";\r
+ m_tocharset=""; \r
+}\r
+\r
+CharsetConverter::CharsetConverter(const std::string &fromcharset, const std::string &tocharset)\r
+{\r
+ SetConversion(fromcharset,tocharset);\r
+}\r
+\r
+CharsetConverter::~CharsetConverter()\r
+{\r
+ if(m_iconv!=(iconv_t)-1)\r
+ {\r
+ iconv_close(m_iconv);\r
+ }\r
+}\r
+\r
+const bool CharsetConverter::SetConversion(const std::string &fromcharset, const std::string &tocharset)\r
+{\r
+ if(m_iconv!=(iconv_t)-1)\r
+ {\r
+ iconv_close(m_iconv);\r
+ m_iconv=(iconv_t)-1;\r
+ }\r
+ if((m_iconv=iconv_open(tocharset.c_str(),fromcharset.c_str()))!=(iconv_t)-1)\r
+ {\r
+ m_fromcharset=fromcharset;\r
+ m_tocharset=tocharset;\r
+ return true; \r
+ }\r
+ else\r
+ {\r
+ m_fromcharset="";\r
+ m_tocharset="";\r
+ }\r
+}\r
+\r
+const bool CharsetConverter::Convert(const std::string &input, std::string &output)\r
+{\r
+ if(m_iconv!=(iconv_t)-1)\r
+ {\r
+ std::vector<char> invec(input.begin(),input.end());\r
+ std::vector<char> outvec(invec.size()*4,0);\r
+#ifdef _WIN32\r
+ const char *inptr=&invec[0];\r
+#else\r
+ char *inptr=&invec[0];\r
+#endif\r
+ char *outptr=&outvec[0];\r
+ size_t insize=invec.size();\r
+ size_t outsize=outvec.size();\r
+ size_t rval=0;\r
+ \r
+ rval=iconv(m_iconv,&inptr,&insize,&outptr,&outsize);\r
+ \r
+ if(outsize>=0)\r
+ {\r
+ outvec.resize(outptr-&outvec[0]);\r
+ output="";\r
+ output.append(outvec.begin(),outvec.end());\r
+ }\r
+ else\r
+ {\r
+ return false;\r
+ }\r
+ \r
+ }\r
+ else\r
+ {\r
+ return false; \r
+ }\r
+}\r