字符编码导致Rapidjson(腾讯开源的json解析库)到Fastjson(阿⾥开发的J。
。。
开发环境说明安卓在线解析json
最近在客户端的开发的过程中,使⽤到了RapidJson,公司的开发是客户端和数据库端都由不同的⼈进⾏开发,我负责的客户端的逻辑开发(使⽤c++),开发⼯具同时使⽤了VS2017和QT的编译环境,使⽤QT主要是为了客户端界⾯开发⽅便,⽽使⽤了VS环境主要是维护公司开发的数据库接⼝库,这个库的唯⼀作⽤就是作为⼀个中间桥梁,使⽤Rapidjson将数据库接⼝的json数据格式解析为结构体数据,从⽽在客户端界⾯进⾏展⽰,或者接收客户端的数据,使⽤Rapidjson将其转换为json数据,发送给数据库接⼝以保存数据使⽤ 。不太明⽩的可以参考我上⼀篇⽂章说明。
问题说明及其截图
在⽇常的开发中,⼀般使⽤http进⾏数据传输,都是使⽤UTF-8进⾏编码,然⽽在我们使⽤C++开发时,很多时候选择了GBK或者
GB2312的编码格式进⾏开发,这样就会由于编码的不⼀致性,导致很多奇奇怪怪的问题,我这⾥出现的问题,就是将JSON数据传输给服务器端的时候,服务器端抛出了如下图的问题
只要有点java基础的⼈都知道,这个问题就是fastjson解析json时抛出异常,这个时候⼀般格式问题导致的情况居多,然⽽通过测试发现,输⼊纯英⽂的时候,不会抛出异常,⼀旦在客户端输⼊中⽂的时候,就会导致这⼀异常情况的发⽣,这时候,不⽤多想,肯定是编码不⼀致导致的问题了。我这⾥是从客户端输⼊数据(QT环境)-到库(VS2017环境)-到数据库接⼝(intellij idea),所以只要保证库到数据库接⼝环境使⽤UTF-8就可以了,然⽽在开发中,也要注意从QT到VS环境时,编码的问题,否则可能出现数据能保存成功,但是却出现乱码的情况。对编码有兴趣的同学可以查阅相关资料,这⾥只是记录⾃⼰在使⽤RapidJson遇到的问题记录下来。
⾸先是QT端的代码到库代码的部分截图
这⾥我们使⽤的结构体的字符参数是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格式即可,相信每次的⼩问题,通过⾃⼰的积累都会使得⾃⼰更加强⼤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论