文《关于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。

时间: 2024-12-26 08:57:21

文《关于c++与java中文乱码问题分析与解决》中一个bug分析的相关文章

文《左右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::

java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基础知识 在了解各种字符集之前我们需要了解一些最基础的知识,如:编码.字符.字符集.字符编码基础知识. 编码 计算机中存储的信息都是用二进制表示的,我们在屏幕上所看到文字.图片等都是通过二进制转换的结果.编码是信息从一种形式或格式转换为另一种形式的过程,通俗点讲就是就是将我们看到的文字.图片等信息按照

URL地址中中文乱码详解(javascript中encodeURI和decodeURI方法、java.net.URLDecoder.encode、java.net.URLDecoder.decode)

引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生了,该如何解决呢?且听本文详细道来. 1.  问题的引出 在Restful的服务设计中,查询某些信息的时候,一般的URL地址设计为: get /basic/service? keyword=历史 , 之类的URL地址. 但是,在实际的开发和使用中,确是有乱码情况的发生,在后台的读取keyword信息为乱码,无法正确读取. 2. 乱码是如

关于c++与java中文乱码问题分析与解决

关于c++与java中文乱码问题分析与解决 DionysosLai([email protected])  2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码方式存在差异. 在java内部是使用16bit的unicode编码(即utf-16)来表示字符串,无论英文还是中文都是2字节. C/C++使用的是原始数据,ascii是一个字节,中文一般是GB2312编码,用2个字节表示一个汉字. Jni内部是使用utf-8编码表示字符串的,utf-8是扁长的unic

java中文乱码解决方法汇总

publicstaticvoidmain(String[]argv){ try{ System.out.println("中文");//1 System.out.println("中文".getBytes());//2 System.out.println("中文".getBytes("GB2312″));//3 System.out.println("中文".getBytes("ISO8859_1″));

java中文乱码解决之道(一)-----认识字符集

沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.com来解决问题.阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有一个清晰明了的认识,于是LZ想通过这系列博文(估计只有几篇)来彻底分析.解决java中文乱码问题,如有错误之处望各位同仁指出!当然,此系列博文并非LZ完全原创,都是在前辈基础上总结,归纳,如果雷同纯属借鉴-- 问

Java中文乱码处理

一.处理get方法中文乱码 方法1   String name = new String(request.getParameter("userName").getBytes("iso-8859-1")); 方法2   在tomcat的conf文件下server.xml中redirectPort="8443"位置后添加: URIencoding="GBK" 二.处理post方法中文乱码 request.setCharacte

java中文乱码解决之道(七)-----JSP页面编码过程

我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="GBK" %> 在上面代码中有两个地方存在编码:pageEncoding.contentType的charset.其中pageEnco

Java中文乱码原因

Java在中文环境中乱码无处不在,而且出现的时间和位置也包涵广泛,具体的解决方法也是千奇百怪. 但是如果能理清其中的脉络,理解字符处 理的过程,对于解决问题很有指导意义,不至于解决了问题也不知道为什么. 其实,原因不外乎出在String输入时和输出时. 首先,Java中的任何String都是以UNICODE格式存在的. 很多人因为在GBK环境中使用String,会误以为String是GBK格式,实际上Java的String类中并没有存储CharSet信息的字段, 所有String中的字符只会以U