文《左右c++与java中国的垃圾问题的分析与解决》一bug分析
文《左右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分析的更多相关文章
- 左右c++与java中国的垃圾问题的分析与解决
左右c++与java中国的垃圾问题的分析与解决 DionysosLai(906391500@qq.com) 2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码 ...
- 在java中使用RBL服务器(中国反垃圾邮件联盟的CBL+使用)
这是06年写的,不知道现在RBL改了没,不过恢复过来做记录,以后可能需要. 实时黑名单(RBL)实际上是一个可供查询的IP地址列表,通过DNS的查询方式来查找一个IP地址的A记录是否存在来判断其是否被 ...
- Java GC(垃圾回收)机制知识总结
目录 Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收 ...
- 一文带你学会java的jvm精华知识点
前言 本文分为20多个问题,通过问题的方式,来逐渐理解jvm,由浅及深.希望帮助到大家. 1. Java类实例化时,JVM执行顺序? 正确的顺序如下: 1父类静态代码块 2父类静态变量 3子类静态代码 ...
- Java编程思想学习笔记_1(Java内存和垃圾回收)
1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- struts2注解redirect传递参数解决方案时,中国的垃圾问题
struts2注解redirect传递参数解决方案时,中国的垃圾问题 试过很多方法 tomcat 编码 .字符串转换 .URLEncoder .. 但是,没有解决方案,然后仔细阅读 stru ...
- 【java虚拟机序列】java中的垃圾回收与内存分配策略
在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...
- 高吞吐低延迟Java应用的垃圾回收优化
高吞吐低延迟Java应用的垃圾回收优化 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经 ...
随机推荐
- Web Reference for a WCF Service has Extra “IdSpecified” Parameter ?
Question: I created a WCF service that exposed a method that has one paramater: public class Service ...
- DHCP Option 60 认识
原文地址: http://blog.163.com/chenqioulin_1983/blog/static/83216232010109104430251/ 首先还是看看RFC咋说的吧.DHCP ...
- BackGroundWorker使用总结
方法: backgroundWorker1.CancelAsync() 用于取消异步执行 backgroundWorker1.ReportProgress(int ,object)用于向主线层报告进度 ...
- 【Linux探索之旅】第一部分第四课:磁盘分区,并完成Ubuntu安装
内容简介 1.第一部分第四课:磁盘分区,并完成Ubuntu安装 2.第一部分第五课预告:Unity桌面,人生若只如初见 磁盘分区 上一课我们正式开始安装Ubuntu了,但是到了分区的那一步,小编却戛然 ...
- URAL 1553. Caves and Tunnels 树链拆分
一颗树 每次出发点右键值是0 2操作模式1.第一i右键点值添加x 2.乞讨u至v在这条路上右上方值 树为主的连锁分裂称号 #include <cstdio> #include <cs ...
- HDFS建筑与shell操作
一个.hadoop1.1.0演示 hadoop它适合于大容量数据存储和分布式计算平台 hadoop核心由hdfs和mapreduce组成 hdfs这是一个主从结构,仅有一个.是namenode:从节点 ...
- Guest与virtio netdev交互模式
Qemu为virtio设备分配了专门的pci设备ID,device IDs (vendor ID 0x1AF4) from 0x1000 through 0x10FF,而pci子系统中的厂商ID和设备 ...
- win7下go web之revel
win7下go web之revel安装 接着上回记录的win7下go环境搭建,go的开发,现在除了sublime外,LiteIDE比较推荐,下载链接 下载安装后直接打开,需要配置下go环境(本机使 ...
- combobox自己主动提示组件加入无选中项清空功能
这个标题非常绕口,只是这也是想了半天的成果,对不起体育老师了. 标题想表达的是:之前讲过的用combobox实现自己主动提示组件.只是如今规定该组件不能够保存data中不存在的数据. 最初的想法是通过 ...
- A星寻路lua实现
他遇见了自己的主动性的需要找到它的项目的方式,我决定开始学习A明星,为A星我没有深究,它只能说是勉强获得需求.在此和大家分享一下.共同进步. A星有一个公式 f(x) = g(x) + h(x) ,这 ...