文《左右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-10-18 22:35:26

文《左右c++与java中国的垃圾问题的分析与解决》一bug分析的相关文章

在java中使用RBL服务器(中国反垃圾邮件联盟的CBL+使用)

这是06年写的,不知道现在RBL改了没,不过恢复过来做记录,以后可能需要. 实时黑名单(RBL)实际上是一个可供查询的IP地址列表,通过DNS的查询方式来查找一个IP地址的A记录是否存在来判断其是否被列入了该实时黑名单中.基于这条原理,那么要写客户端就比较容易了. 使用JNDI查询 DirContext ictx = new InitialDirContext();Attributes a = ictx.getAttributes("dns://cblplus.anti-spam.org.cn/

Java GC(垃圾回收)机制知识总结

目录 Java GC系列 Java系列笔记(3) - Java 内存区域和GC机制 面试题:"你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?" Java GC系列 本部分来自Java GC系列(1):Java垃圾回收简介 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序. 下面四篇教程是了解Java 垃圾回收(GC)的基

Java虚拟机之垃圾回收详解一

Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这些程序包括:实用程序.游戏.商业应用程序.在全世界范围内,Java运行在超过数十亿台个人计算机上,数十亿台设备上,还包括手机和电视设备.Java由一系列的关键组件作为一个整体构建出了Java平台. Java Runtime Edition 当你下载Java,你就得到了Java运行环境(JRE).JR

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

java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是

答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为"无意识的对象保持".如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处理这个对象,而且也不处理被这个对象引用的其它对象."内存泄露"就是内存中某些内存不可被回收. 举个例子:如果对一个栈(Stack类)先是进行入栈操作,之后再进行出栈操作,那么弹出来的对象将不会被当做垃圾回收,即使使用栈的客户程序不再引用这些对象,因为栈内部存在着对这些已

Java中的垃圾回收机制

什么是垃圾 在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行. 失去引用关系的对象,称为垃圾对象. 垃圾回收算法 1. 引用计数法 根据“垃圾”的定义,直观的做法就是,为每个对象设置一个引用计数器.对对象进行扫描时,如果其引用为0则认为是垃圾,就可以准备回收了. 但是这样做的缺点在于,没有办法消除循环引用的垃圾对象,例如: public class Main {     public static void main(String[] args) {     

【java虚拟机序列】java中的垃圾回收与内存分配策略

在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃圾回收(Garbage Collection,GC)是java语言的一大特色,在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.而在C/C++中是需要程序员主动释放的,而在java中则交给JVM自动完成,既然是交给程序自动执行,那么这里就必须完成以下几件事:

浅析如何将XML文档解析成java对象(待梳理)

User类 public class User implements Serializable { private static final long serialVersionUID = 7506854293380407436L; private Integer id; private String loginName; private String password; private Date createDate; private String username; public User(

转-java编译时error: illegal character &#39;\ufeff&#39; 的解决办法-https://blog.csdn.net/t518vs20s/article/details/80833061

原文链接:https://blog.csdn.net/shixing_11/article/details/6976900 最近开发人员通过SVN提交了xxx.java文件,因发布时该包有问题需要回退,故SCM将该xxx.java文件用editplus打开删除了新添的一行,删除后重新编译打包,却报了如下异常: java:[1,0] illegal character: \65279 表面看着该文件确实没错,看不出来问题,后来从SVN上更新下代码以后,发现本地也不报错,后来通过Eclipse查看了