c/c++语言开发共享使用iconv进行编码gb2312转utf8 转码失败的坑

iconv 编码gb2312转utf8 转码失败的坑 使用背景 项目中使用thrift进行C 程序调用c++接口,其中的协议是通过json进行传输的,由于默认thrift使用utf8进行传输,而C 和c++程序都默认使用多字节的编码方式,所以在传输前就需要对编码进行utf8的转换,而在接收处理的时候 …


iconv 编码gb2312转utf8 转码失败的坑

使用背景

项目中使用thrift进行c#程序调用c++接口,其中的协议是通过json进行传输的,由于默认thrift使用utf8进行传输,而c#和c++程序都默认使用多字节的编码方式,所以在传输前就需要对编码进行utf8的转换,而在接收处理的时候再转换成gb2312。

使用iconv进行编码gb2312转utf8 转码失败的坑

问题

bug发生在一个文件路径上面,包含文件路径就会导致c++端无法解析,但是纯中文和英文及不同字符都没有问题,所以一开始未怀疑是编码问题,经过调试最终确定问题在iconv转码上,在转码的时候转换失败,导致返回结果为空。

分析

文件名为"1癵鰢⑷}·ˇ々.mp4",其中包含有特殊汉字和字符,猜测为字符集无法表示导致转码失败。

解决

网上查询确实存在改问题,建议将编码gb2312换成 gb18030 以支持更多字符。

原来的转码函数

std::string convertcode::gbk2utf8(const std::string& strgbk) {     return code_convert("gb2312", "utf-8", strgbk); }

转变以后测试正常

std::string convertcode::gbk2utf8(const std::string& strgbk) {     return code_convert("gb18030", "utf-8", strgbk); }

附iconv转变函数

std::string convertcode::code_convert(char *source_charset, char *to_charset, const std::string& sourcestr) {     iconv_t cd = iconv_open(to_charset, source_charset);//获取转换句柄,void*类型     if (cd == 0)         return "";      size_t inlen = sourcestr.size();      if (inlen == 0)         return "";      size_t outlen = inlen*2+1;     const char* inbuf = (char*)sourcestr.c_str();     char* outbuf = (char*)malloc(outlen);     memset(outbuf, 0, outlen);     char *poutbuf = outbuf; //多加这个转换是为了避免iconv这个函数出现char(*)[255]类型的实参与char**类型的形参不兼容     if (iconv(cd, &inbuf, &inlen, &poutbuf, &outlen) == -1)         return "";      std::string strtemp(outbuf);//此时的strtemp为转换编码之后的字符串     iconv_close(cd);     return strtemp; }

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/603986.html

(0)
上一篇 2021年5月12日
下一篇 2021年5月12日

精彩推荐