jsoncpp 解码编码 中文为空 乱码问题

在此,仅对自己出现的问题做个总结,没想到能帮到大家。

本地C++桌面程序,用jsoncpp 对json和服务端进行通信,静态库编译不能用,故采用的源码拷贝进行调用

服务端 用php和客户端进行通信

服务端json 解码和编码的两个函数 json_encode json_decode

如果使用在使用json_encode的中的字符串中有中文的话,有可能会出现,编码后,字符串为空,

这个我遇到的一个原因是 php脚本文件的类型是ansi 而不是utf8 ,所以用txt文本编辑器,将脚本另存为 utf8即可,如果没有解决问题,只能绕道找找别的原因和方法了。

再说说客户端C++桌面应用程序,使用jsoncpp 和服务器通信,上传json数据的时候,json的中文总是会不对,要么乱码,要么没有值。

好像以前看过哪篇文章,记不清了,在这里提一句,对不对看各位的理解,错了,请指出,或者不会产生误导就行。说是jsoncpp 只支持ansi编码的字符串数据格式

可能是让我瞎猫碰到死耗子了吧,折腾了一个多小时的问题,用这个办法解决了。

本人的编译环境vs2015 win7  平台编码字符集为unicode

用jsoncpp 编码上传总是出错,用工具函数UnicodeToANSI一转,再传输,就没有问题了。下面贴一下,常用的几个工具函数,建议封装成一个工具类,函数声明为静态函数,通过类名::函数名直接调用即可

#include "cutil.h"
#include <Windows.h>
wstring CUtil::UTF8ToUnicode(const string& str)
{
    int  len = 0;
    len = str.length();
    int  unicodeLen = ::MultiByteToWideChar(CP_UTF8,
        0,
        str.c_str(),
        -1,
        NULL,
        0);
    wchar_t *  pUnicode;
    pUnicode = new  wchar_t[unicodeLen + 1];
    memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t));
    ::MultiByteToWideChar(CP_UTF8,
        0,
        str.c_str(),
        -1,
        (LPWSTR)pUnicode,
        unicodeLen);
    wstring  rt;
    rt = (wchar_t*)pUnicode;
    delete  pUnicode;

    return  rt;
}

string CUtil::UnicodeToUTF8(const wstring& str)
{
    char*     pElementText;
    int    iTextLen;
    // wide char to multi char
    iTextLen = WideCharToMultiByte(CP_UTF8,
        0,
        str.c_str(),
        -1,
        NULL,
        0,
        NULL,
        NULL);
    pElementText = new char[iTextLen + 1];
    memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1));
    ::WideCharToMultiByte(CP_UTF8,
        0,
        str.c_str(),
        -1,
        pElementText,
        iTextLen,
        NULL,
        NULL);
    string strText;
    strText = pElementText;
    delete[] pElementText;
    return strText;
}

wstring CUtil::ANSIToUnicode(const string& str)
{
    int len = 0;
    len = str.length();
    int unicodeLen = ::MultiByteToWideChar(CP_ACP,
        0,
        str.c_str(),
        -1,
        NULL,
        0);
    wchar_t * pUnicode;
    pUnicode = new wchar_t[unicodeLen + 1];
    memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t));
    ::MultiByteToWideChar(CP_ACP,
        0,
        str.c_str(),
        -1,
        (LPWSTR)pUnicode,
        unicodeLen);
    wstring rt;
    rt = (wchar_t*)pUnicode;
    delete pUnicode;
    return rt;
}

string CUtil::UnicodeToANSI(const wstring& str)
{
    char*     pElementText;
    int    iTextLen;
    // wide char to multi char
    iTextLen = WideCharToMultiByte(CP_ACP,
        0,
        str.c_str(),
        -1,
        NULL,
        0,
        NULL,
        NULL);
    pElementText = new char[iTextLen + 1];
    memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1));
    ::WideCharToMultiByte(CP_ACP,
        0,
        str.c_str(),
        -1,
        pElementText,
        iTextLen,
        NULL,
        NULL);
    string strText;
    strText = pElementText;
    delete[] pElementText;
    return strText;
}

代码中调用

string str = CUtil::UnicodeToANSI(client->GetName().GetBuffer(0));

login["name"] = str;

到此,我的问题解决了,欢迎留言探讨,总有不同的问题,也总有不同的方法应对。

本人较懒,对原理的东西弄得有些含糊。

唯有下的苦功,才可习得真功啊!

时间: 2024-08-23 14:28:03

jsoncpp 解码编码 中文为空 乱码问题的相关文章

FileReader读取中文txt文件编码丢失问题(乱码)(转)

有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=new String(str.getBytes(),"UTF-8");结果大部分中文显示正常,但最后仍有部分汉字显示为问号! public static List<String> getLines(String fileName){ List<String> lines=new ArrayList<String>(); try { BufferedRead

Spring MVC Controller中解析GET方式的中文参数会乱码的问题(tomcat如何解码)

Spring MVC Controller中解析GET方式的中文参数会乱码的问题 问题描述 在工作上使用突然出现从get获取中文参数乱码(新装机器,tomcat重新下载和配置),查了半天终于找到解决办法. 为何会乱码 Spring MVC 是基于Servlet,在Http请求到达Servlet解析之前,GET过来的URL已经被Tomcat先做了一次URLDecode.Tomcat对GET方式默认的URL解码结果是iso-8859-1而不是我认为的UTF-8. 解决方案 解决方案也很简单,除了平常

URL请求中文、符号“乱码”(解码、转码)解决方式

有的字符在url中传递的时候回编码(可能是自动的)将其符号转变为%加上ASCII码:如果在客户端或者服务端接收到的时候没有解码就会出现类似乱码的问题:其实不然只是没有进行解码 附部分编码规则 十六进制值 1. + URL 中+号表示空格 %2B 2. 空格 URL中的空格可以用+号或者编码 %20 3. / 分隔目录和子目录 %2F 4. ? 分隔实际的 URL 和参数 %3F 5. % 指定特殊字符 %25 6. # 表示书签 %23 7. & URL 中指定的参数间的分隔符 %26 8. =

PHP解码unicode编码中文字符代码示例

在抓取某网站数据,结果在数据包中发现了一串编码的数据:"......\u65b0\u6d6a\u5fae\u535a......", 这其实是中文被unicode编码后了的数据,想解码出中文来.解决方案:方案A(稳定版+推荐): function replace_unicode_escape_sequence($match) { return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE'); } $name

PHP实现中文截取无乱码

字符串的处理是编程中比较常见的,各种编程语言对字符串的处理也提供了大量函数,像php中mb_substr()函数可以实现对中文字符串的截取,如何使用自定义方法实现中文字符串截取无乱码这也是面试经常遇到的一道题目,不要觉得这是多此一举,php内置函数已经实现了,为什么要自己实现.其实这道题的真实目的是考查你对字符编码的理解.最起码你要知道从哪里开始截取,截取几个字节才是一个完整的字符,不然截取到的都是乱码.这就需要你对多字节字符编码有一定的了解.下面一起来实现吧. 1 <?php 2 /** 3

asp.net url址址中中文汉字参数传递乱码解决方法

中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirect("B.asp教程x?Name="+Server.UrlEncode(Name)); 接参的时候用UrlDecode: Response.Write(Server.UrlDecode(Request.QueryString["Name"])); 脚本儿里传参的时候用e

Linux系统中 Sublime Text 中文 GBK 文件乱码问题

Sublime Text 是一个很不错编辑器,具有漂亮的界面和强大的功能.再加上丰富的插件,而且还跨平台,绝对是一款实打实的神器啊! 众所周知,Sublime Text 对中文支持的极差,可以说几乎就没有特别的支持.尤其是 GBK 编码的中文文件,直接打开就是一团乱码.ST 的开发者 Jon Skinner 貌似对中国市场不怎么感冒,一直未加中文 GBK 的支持.既然开发者不给支持中文,那么就只能靠中国用户自己解决问题了.在这里感谢热心网友 seanliang 开发了强大的 ConvertToU

JS传递中文参数出现乱码的解决办法

一.window.open() 乱码: JS中使用window.open("url?param="+paramvalue)传递参数出现乱码,提交的时候,客户端浏览器URL中显示参数是正确的, 但是传到了服务器端是是乱码.这种情况下需要在客户端对该参数进行编码,然后在服务器端解码即可. 1.JS客户端编码: var selStr=document.getElementsByName('selStr')[0].value; selStr=encodeURI(encodeURI(selStr

AJAX在Post中文的时候乱码的解决方法

加上设置字符编码的方法: response.setHeader("charset","gb2312"); ******************************************** 看到的说明原文如下: 用AJAX来GET回一个页面时,RESPONSETEXT里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,是把resposeBody按UTF-8编码进解码考形成的,如果服务器送出的确实是UTF-8的数据流的时候