iconv 踩坑

iconv 踩坑std stringboost game utils code convert constchar from charset constchar to charset conststd string amp amp amp amp amp instr if instr empty return iconv tcd size tinlen instr si

  • 看看 code_convert1 方法的坑在哪里
std::string code_convert1(const char* from_charset, const char* to_charset, const std::string& instr) { if (instr.empty()) return ""; iconv_t cd; size_t inlen = instr.size(); char* inbuf = (char*)instr.c_str(); size_t outlen = inlen * 3 + 2; char* outbuf = (char*)malloc(outlen); std::string outstr; char pin = &inbuf; char pout = &outbuf; cd = iconv_open(to_charset, from_charset); if (cd == 0) return ""; memset(outbuf, 0, outlen); size_t oldOutLen = outlen; size_t ret = iconv(cd, pin, &inlen, pout, &outlen); if (ret == 0) outstr.append(outbuf);//这里的值是错的 iconv_close(cd); free(outbuf);//执行到此处时,程序会崩溃 return outstr; } 

程序执行到 free(outbuf) 这行的时候,发生崩溃,原因是在 iconv() 这个方法内部, pout 的值发生了改变,导致 outbuf 指向的地址发生变化,不再指向最初分配的空间地址了,所以需要增加一个临时变量,用来保存最初分配的空间地址,下面是正确的写法。

  • 正确写法 code_convert2
 std::string code_convert2(const char* from_charset, const char* to_charset, const std::string& instr) { if (instr.empty()) return ""; iconv_t cd; size_t inlen = instr.size(); char* inbuf = (char*)instr.c_str(); size_t outlen = inlen * 3 + 2; char* outbuf = (char*)malloc(outlen); char* pFreeOut = outbuf;//用这个变量保存最初分配的空间地址 std::string outstr; char pin = &inbuf; char pout = &outbuf; cd = iconv_open(to_charset, from_charset); if (cd == 0) return ""; memset(outbuf, 0, outlen); size_t oldOutLen = outlen; size_t ret = iconv(cd, pin, &inlen, pout, &outlen); if (ret == 0) outstr.append(pFreeOut);//这里的值是正确的 iconv_close(cd); free(pFreeOut);//这里再释放就正确了 return outstr; } 

测试代码

#pragma comment(lib,"libiconv.lib") int main() { std::string ret; std::string ins = "test"; //ret = code_convert1("utf-8", "gbk", ins); ret = code_convert2("utf-8", "gbk", ins); return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212217.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午8:33
下一篇 2026年3月18日 下午8:33


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号