文《关于c++与java中文乱码问题分析与解决》中一个bug分析
文《关于c++与java中文乱码问题分析与解决》中一个bug分析
DionysosLai([email protected]) 2014/10/21
在前几篇一博客《关于c++与java中文乱码问题分析与解决》,地址如下:http://blog.csdn.net/dionysos_lai/article/details/38389765。文中详细介绍了c++与java数据传递时,为何会出现中文乱码的原因,并提出了适当的解决方法。方法如下:
int CCDirector::GBKToUTF8(std::string &gbkStr) { iconv_t iconvH; iconvH = iconv_open("utf-8","gb2312"); if(iconvH == 0){ return -1; } const char* strChar = gbkStr.c_str(); const char** pin = &strChar; size_t strLength = gbkStr.length(); char* outbuf = (char*)malloc(strLength*4); char* pBuff = outbuf; memset(outbuf,0,strLength*4); size_t outLength = strLength*4; <span style="color:#ff6666;"><strong>#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) if(-1 == iconv(iconvH,pin,&strLength,&outbuf,&outLength)){ iconv_close(iconvH); return -1; } #else if(-1 == iconv(iconvH,(char **)pin,&strLength,&outbuf,&outLength)){ iconv_close(iconvH); return -1; } #endif</strong></span> gbkStr = pBuff; iconv_close(iconvH); return 0; }
这个方法,在这两个月的项目中,经过了多个游戏的检测,没有大的问题。不够后来,在传递一个特殊字符串时,发现了一个严重的bug。这个特殊的字符串就是空字符,即””。这时,传递过来的就是乱码了。不管在Win32和Android平台,均是这样情况。
问题,是出现在以下一段代码中:
size_t strLength = gbkStr.length(); char* outbuf = (char*)malloc(strLength*4); char* pBuff = outbuf;当我们传递的是空字符(””)时,strLength值为0,那么下面的内存赋值,明显会出现错误。因此对于空字符””,要做进一步的处理了。处理后的代码如下所示:
int XtcUtils::GBKToUTF8(std::string &gbkStr) { iconv_t iconvH; iconvH = iconv_open("utf-8","gb2312"); if(iconvH == 0){ return -1; } const char* strChar = gbkStr.c_str(); const char** pin = &strChar; size_t strLength = gbkStr.length(); if (0 == strLength) ///< 特殊情况下,gbkStr为"",strLength = 0时,转码会有乱码 { gbkStr = ""; } else { char* outbuf = (char*)malloc(strLength*4); char* pBuff = outbuf; memset(outbuf,0,strLength*4); size_t outLength = strLength*4; #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) if(-1 == iconv(iconvH,pin,&strLength,&outbuf,&outLength)){ iconv_close(iconvH); return -1; } #else if(-1 == iconv(iconvH,(char **)pin,&strLength,&outbuf,&outLength)){ iconv_close(iconvH); return -1; } #endif gbkStr = pBuff; } iconv_close(iconvH); return 0; }
以上就是详实的代码了,有摘抄前文代码的同学们,希望改正下,不要出现严重的bug。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。