字符编码导致Rapidjson(腾讯开源的json解析库)到Fastjson(阿里开发的Java json解析库)转换失败的原因分析

简介: 最近在客户端的开发的过程中,使用到了RapidJson,公司的开发是客户端和数据库端都由不同的人进行开发,我负责的客户端的逻辑开发(使用c++),开发工具同时使用了VS2017和QT的编译环境,使用QT主要是为了客户端界面开发方便,而使用了VS环境主要是维护公司开发的数据库接口库,这个库的唯一作用就是作为一个中间桥梁,使用Rapidjson将数据库接口的json数据格式解析为结构体数据,从而在客户端界面进行展示,或者接收客户端的数据,使用Rapidjson将其转换为json数据,发送给数据库接口以保存数据使用 。不太明白的可以参考我上一篇文章说明Rapidjson的使用过程-Parse解析数组

开发环境说明

最近在客户端的开发的过程中,使用到了RapidJson,公司的开发是客户端和数据库端都由不同的人进行开发,我负责的客户端的逻辑开发(使用c++),开发工具同时使用了VS2017和QT的编译环境,使用QT主要是为了客户端界面开发方便,而使用了VS环境主要是维护公司开发的数据库接口库,这个库的唯一作用就是作为一个中间桥梁,使用Rapidjson将数据库接口的json数据格式解析为结构体数据,从而在客户端界面进行展示,或者接收客户端的数据,使用Rapidjson将其转换为json数据,发送给数据库接口以保存数据使用 。不太明白的可以参考我上一篇文章说明Rapidjson的使用过程-Parse解析数组遇到的问题,附自己的解决方式。


问题说明及其截图

在日常的开发中,一般使用http进行数据传输,都是使用UTF-8进行编码,然而在我们使用C++开发时,很多时候选择了GBK或者GB2312的编码格式进行开发,这样就会由于编码的不一致性,导致很多奇奇怪怪的问题,我这里出现的问题,就是将JSON数据传输给服务器端的时候,服务器端抛出了如下图的问题

e1717cf1364ef430bf8eced31f648dbd_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FiY2Q1NTIxOTE4Njg=,size_16,color_FFFFFF,t_70#pic_center.png

只要有点java基础的人都知道,这个问题就是fastjson解析json时抛出异常,这个时候一般格式问题导致的情况居多,然而通过测试发现,输入纯英文的时候,不会抛出异常,一旦在客户端输入中文的时候,就会导致这一异常情况的发生,这时候,不用多想,肯定是编码不一致导致的问题了。我这里是从客户端输入数据(QT环境)-到库(VS2017环境)-到数据库接口(intellij idea),所以只要保证库到数据库接口环境使用UTF-8就可以了,然而在开发中,也要注意从QT到VS环境时,编码的问题,否则可能出现数据能保存成功,但是却出现乱码的情况。对编码有兴趣的同学可以查阅相关资料,这里只是记录自己在使用RapidJson遇到的问题记录下来。

首先是QT端的代码到库代码的部分截图

8fd0b0f26c5eb0e3332c3fd117d14983_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FiY2Q1NTIxOTE4Njg=,size_16,color_FFFFFF,t_70#pic_center.png

这里我们使用的结构体的字符参数是char数组,不是c++标准库的string,首先将页面的字符数据(QString)使用toLocal8Bit()(这里不能使用toUtf8(),因为还要经过一次库的转化,否则这里就转化为UTF8编码格式,到库的环境又变成GBK的编码格式了,这里有点混乱,可以将数据存到数据库,但是存储的数据却是乱码)函数将其拷贝到结构体中,传给库使用,以下截图是库的代码截图


上图画红线部分时将其客户端传来的字符数组参数先转换为UTF-8编码的格式,然后在通过RapidJson将其数据传送给服务器端,这样就不会出现第一张图的异常了。转换函数为以下代码:

void CEncodingTools::ConvertGBToUTF8(const char* pcGBString, char* pcUTF8String, int nUTF8BuffSize)
{
  // GB2312转换成UTF-8 
  int nWideSize = MultiByteToWideChar(CP_ACP, 0, pcGBString, -1, NULL, 0);  
  WCHAR* wstrSrc = new WCHAR[nWideSize + 1];  
  MultiByteToWideChar(CP_ACP, 0, pcGBString, -1, wstrSrc, nWideSize + 1);   
  WideCharToMultiByte(CP_UTF8, 0, wstrSrc, -1, pcUTF8String, nUTF8BuffSize, NULL, NULL);  
  delete[] wstrSrc;
}


结论

PS: 一个小小的bug,写了这么多,难免有点啰嗦,主要是自己经验太少,花了好几个小时才解决了,只要记住,客户端和服务器端在数据传输的过程中,只要保证传输的格式为UTF-8格式即可,相信每次的小问题,通过自己的积累都会使得自己更加强大。


相关文章
|
6月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
7月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
8月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
382 2
|
7月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
272 0
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
482 2
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1212 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
504 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多
  • DNS