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

DionysosLai(906391500@qq.com) 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。

版权声明:本文博主原创文章。博客,未经同意不得转载。

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

  1. 左右c++与java中国的垃圾问题的分析与解决

    左右c++与java中国的垃圾问题的分析与解决 DionysosLai(906391500@qq.com)  2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码 ...

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

    这是06年写的,不知道现在RBL改了没,不过恢复过来做记录,以后可能需要. 实时黑名单(RBL)实际上是一个可供查询的IP地址列表,通过DNS的查询方式来查找一个IP地址的A记录是否存在来判断其是否被 ...

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

    目录 Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收 ...

  4. 一文带你学会java的jvm精华知识点

    前言 本文分为20多个问题,通过问题的方式,来逐渐理解jvm,由浅及深.希望帮助到大家. 1. Java类实例化时,JVM执行顺序? 正确的顺序如下: 1父类静态代码块 2父类静态变量 3子类静态代码 ...

  5. Java编程思想学习笔记_1(Java内存和垃圾回收)

    1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...

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

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  7. struts2注解redirect传递参数解决方案时,中国的垃圾问题

    struts2注解redirect传递参数解决方案时,中国的垃圾问题 试过很多方法  tomcat 编码  .字符串转换 .URLEncoder  .. 但是,没有解决方案,然后仔细阅读   stru ...

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

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

  9. 高吞吐低延迟Java应用的垃圾回收优化

    高吞吐低延迟Java应用的垃圾回收优化 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经 ...

随机推荐

  1. iOS--浅谈iOS沙盒目录

    原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713 出于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文 ...

  2. 【Java EE 学习 34】【struts2学习第一天】

    一.struts2简介 struts2是一个用来开发MVC应用程序的框架.它提供了Web应用程序开发过程中的一些常见问题的解决方案. 1.struts2的作用域范围:三层架构当中的第一层,相当于MVC ...

  3. j技术方案

    采用.net4.0作为基础技术平台,原来是采用.net4.5的,但是后来发现.net4.5不支持Windows Server2003,所以又降为.net4.0. 1.asp.net mvc 4.0 用 ...

  4. LeetCode - Triangle

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

  5. javascript使浏览器关闭前弹出确认

    当用户关闭页面时,弹出对话框,让用户确认是否关闭,选择确定则页面关闭,否则页面不关闭. 效果体验:http://keleyi.com/keleyi/phtml/js/index.htm 完整代码: & ...

  6. AngularJS开发指南10:AngularJS依赖注入的详解

    依赖注入是一种软件设计模式,用来处理代码的依赖关系. 一般来说有三种方法让函数获得它需要的依赖: 它的依赖是能被创建的,一般用new操作符就行. 能够通过全局变量查找依赖. 依赖能在需要时被导入. 前 ...

  7. windows 64位整数

    #include <iostream> #include <ctime> using namespace std; int main() { cout << cou ...

  8. Spring MVC中基于注解的 Controller

         终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...

  9. INFORMATION_SCHEMA.COLUMNS 查询表字段语句

    INFORMATION_SCHEMA.COLUMNS 视图以 sysobjects.spt_data type_info.systypes.syscolumns.syscomments.sysconf ...

  10. JMeter基础之—录制脚本

    Jmeter 是一个非常流行的性能测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细:很它的优点也有很多: l       开源,他是一款开源的免费软 ...