/**
* 字符串编码格式转换
* @param from 原始编码方式
* @param to 目标编码方式
* @param str 源字符串
* @return 转换编码方式后的字符串
*/
string StringUtil::trancoding(const string& from, const string& to, const string& str){
//TODO UCS-2可以看成是 UTF-16的子集 已测试编码 GBK UCS GTU-8 UTF-16 C99
std::string result;
const char* cstrfrom = from.c_str();
const char* cstrto = to.c_str();
// 创建转换句柄
iconv_t iconv_handle = iconv_open(cstrto, cstrfrom);
if (iconv_handle == (iconv_t)(-1)) {
_ERR_("Failed to open iconv");
return result;
}
// 输入参数
char* input_str = const_cast<char*>(str.c_str());
size_t input_size = str.size();
// 输出参数
const size_t buffer_size = input_size * sizeof(wchar_t);
char* output_buffer = new char[buffer_size];
char* output_str = output_buffer;
size_t output_size = buffer_size;
// 进行转换
if (iconv(iconv_handle, &input_str, &input_size, &output_str, &output_size) == (size_t)-1) {
_ERR_("Failed to convert");
iconv_close(iconv_handle);
delete[] output_buffer;
return result;
}
// 关闭转换句柄
iconv_close(iconv_handle);
// 保存转换结果
size_t out_size = buffer_size - output_size;
result.assign(output_buffer, out_size);
delete[] output_buffer;
return result;
}