#include #include #include #include #include "utils.h" #include "common.h" //----------------------------------------------------------------------------- std::string IconvString(const std::string & src, const std::string & from, const std::string & to) { if (src.empty()) return std::string(); size_t inBytesLeft = src.length() + 1; size_t outBytesLeft = src.length() * 2 + 1; char * inBuf = new char[inBytesLeft]; char * outBuf = new char[outBytesLeft]; strncpy(inBuf, src.c_str(), src.length()); inBuf[src.length()] = 0; #if defined(FREE_BSD) || defined(FREE_BSD5) const char * srcPos = inBuf; #else char * srcPos = inBuf; #endif char * dstPos = outBuf; iconv_t handle = iconv_open(to.c_str(), from.c_str()); if (handle == iconv_t(-1)) { if (errno == EINVAL) { printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str()); delete[] outBuf; delete[] inBuf; return src; } else printfd(__FILE__, "IconvString(): iconv_open error\n"); delete[] outBuf; delete[] inBuf; return src; } size_t res = iconv(handle, &srcPos, &inBytesLeft, &dstPos, &outBytesLeft); if (res == size_t(-1)) { printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno)); iconv_close(handle); delete[] outBuf; delete[] inBuf; return src; } dstPos = 0; std::string dst(outBuf); iconv_close(handle); delete[] outBuf; delete[] inBuf; return dst; }